KVC

#import "ViewController.h"
#import "Student.h"
#import "Book.h"
#import "News.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //键-值编码是一种间接访问属性的机制,使用字符串来表示属性而不是通过方法或实例变量
    //1. @"name" -> _name
    //2. @"name" -> name
    Student *student = [[Student alloc] init];
    //[student study];
    [student setValue:@10 forKey:@"age"];
    [student setValue:@11 forKey:@"_age"];
    [student setValue:@"ZhangSan" forKey:@"name"];
    [student setValue:@"Lisi" forKey:@"_name"];
    NSLog(@"%@",[student valueForKey:@"name"]);
    [student introduce];
    //NSLog(@"____");
    
    Book *book = [[Book alloc] init];
    [student setValue:book forKey:@"book"];
    book.title = @"abc";
    [student introduce];
    
    [student setValue:@"西游记" forKeyPath:@"book.title"];
    NSLog(@"%@",[student valueForKeyPath:@"book.title"]);
    [student introduce];
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:@"--sdfd--" forKey:@"name"];
    NSLog(@"%@", dict);
    [dict setObject:@"sjdlsd" forKey:@"name"];
    NSLog(@"%@",dict);
    [dict setValue:@"sdfks" forKey:@"name"];
    NSLog(@"%@",dict);
    
    [student setValuesForKeysWithDictionary:@{@"name":@"sjfls",@"age":@12}];
    [student introduce];
    
    //从主包中获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"json" ofType:@"txt"];
    NSLog(@"%@",path);
    NSString *jsonStr = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",jsonStr);
    
    NSDictionary *dict1 = [NSJSONSerialization JSONObjectWithData:[jsonStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dict1);
    
    NSLog(@"%@",dict1[@"Name"]);//不方便,没有类型检查
    
    News *news = [News new:dict1];
    NSLog(@"%@",news.Name);
    
    
    //KVC还能对集合做运算,比如想得到所有学生的个数、所有学生的年龄总和、所有学生的平均年龄、年龄的最大值和年龄的最小值
    Student *stu = [Student new];
    //stu.age = 10;
    Student *stu1 = [Student new];
    stu1.age = 11;
    Student *stu2 = [Student new];
    stu2.age = 12;
    Student *stu3 = [Student new];
    stu3.age = 13;
    Student *stu4 = [Student new];
    stu4.age = 14;
    Student *stu5 = [Student new];
    stu5.age = 13;
    NSArray *arr = @[stu1,stu2,stu3,stu4,stu5];
    NSLog(@"%@",arr);
    [stu setValue:arr forKey:@"allStudents"];
    NSLog(@"%@",[stu valueForKeyPath:@"allStudents.@count"]);
    NSLog(@"%@",[stu valueForKeyPath:@"allStudents.@max.age"]);
    NSLog(@"%@",[stu valueForKeyPath:@"allStudents.age"]);
    
    //在使用@distinctUnionOfObjects后,发现效果是消除重复的价年龄
    NSLog(@"%@",[stu valueForKeyPath:@"allStudents.@distinctUnionOfObjects.age"]);
    NSLog(@"%@",[stu valueForKeyPath:@"allStudents.age"]);
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

Student.h:

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    NSString *name;
    NSString *_name;
    int _age;
    NSArray *allStudents;
}
@property (nonatomic,assign) int age;
- (void) introduce;
@end

Student.m:

#import "Student.h"
#import "Book.h"
@interface Student ()
{
    Book *_book;
}
@end

@implementation Student

- (void) introduce
{
    NSLog(@"%i--%@--%@",_age,name,_name);
    NSLog(@"%@----%@",_book,_book.title);
}
@end

Book.h:

@interface Book : Student
@property (nonatomic,copy) NSString *title;
@end

Book.m:

#import "Book.h"

@implementation Book

@end

News.h:

#import <Foundation/Foundation.h>

@interface News : NSObject
@property (nonatomic,copy) NSString *Name,*Pic,*Type,*url;
- (instancetype) initWithDictionary:(NSDictionary *)dict;
+ (instancetype) new:(NSDictionary *)dict;
@end

News.m:
@implementation News
- (instancetype) initWithDictionary:(NSDictionary *)dict
{
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}

+ (instancetype) new:(NSDictionary *)dict
{
    return [[[self class] alloc] initWithDictionary:dict];
}


@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值