1. KVC字典操作
TZPerson* p = [TZPerson new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@18,
@"nick":@"Cat",
@"height":@180,
@"dd":@"helo"
};
[p setValuesForKeysWithDictionary:dict];
NSLog(@"p.name = %@, p.age = %d, p.nick =%@, p.height = %f", p.name, p.age, p.nick, p.height);
NSArray* keys = @[@"name", @"age"];
NSDictionary* dict1 = [p dictionaryWithValuesForKeys:keys];
NSLog(@"%@", dict1);
2. KVC消息传递 array
NSArray* arr = @[@"Monday", @"Tuesday", @"Wednesday"];
NSArray* lengthArr = [arr valueForKey:@"length"];
NSLog(@"%@", lengthArr);
NSArray* lowercaseArr = [arr valueForKey:@"lowercaseString"];
NSLog(@"%@", lowercaseArr);
3. 聚合操作符 @avg、@count、@max、@min、@sum
NSMutableArray* students = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
TZPerson* student = [TZPerson new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@(18+i),
@"nick":@"Cat",
@"height":@(1.65 + 0.02*arc4random_uniform(6)),
};
[student setValuesForKeysWithDictionary:dict];
[students addObject:student];
}
NSLog(@"%@", [students valueForKey:@"height"]);
/// 平均身高
float avg = [[students valueForKeyPath:@"@avg.height"] floatValue];
NSLog(@"%f", avg);
4. 数组操作符 @distinctUnionOfObjects @unionOfObjects
NSMutableArray* students = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
TZPerson* student = [TZPerson new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@(18+i),
@"nick":@"Cat",
@"height":@(1.65 + 0.02*arc4random_uniform(6)),
};
[student setValuesForKeysWithDictionary:dict];
[students addObject:student];
}
NSLog(@"%@", [students valueForKey:@"height"]);
//去重
NSArray* arr = [students valueForKeyPath:@"@distinctUnionOfObjects.height"];
NSLog(@"arr = %@", arr);
//不去重
NSArray* arr1 = [students valueForKeyPath:@"@unionOfObjects.height"];
NSLog(@"arr1 = %@", arr1);
5. 嵌套数组操作@distinctUnionOfArrays @unionOfArrays
NSMutableArray* students = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
TZPerson* student = [TZPerson new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@(18+i),
@"nick":@"Cat",
@"height":@(1.65 + 0.02*arc4random_uniform(6)),
};
[student setValuesForKeysWithDictionary:dict];
[students addObject:student];
}
NSMutableArray* students1 = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
TZPerson* student = [TZPerson new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@(18+i),
@"nick":@"Cat",
@"height":@(1.65 + 0.02*arc4random_uniform(6)),
};
[student setValuesForKeysWithDictionary:dict];
[students1 addObject:student];
}
// 嵌套数组
NSArray* nestArr = @[students, students1];
NSArray* arr = [nestArr valueForKeyPath:@"@distinctUnionOfArrays.height"];
NSLog(@"arr = %@", arr);
/*
"1.65",
"1.71",
"1.67",
"1.73",
"1.75",
"1.69"
*/
NSArray* arr1 = [nestArr valueForKeyPath:@"@unionOfArrays.height"];
NSLog(@"arr1 = %@", arr1);
/*
"1.73",
"1.67",
"1.73",
"1.71",
"1.69",
"1.67",
"1.75",
"1.65",
"1.73",
"1.73",
"1.75",
"1.73"
*/
6. 嵌套集合操作 @distinctUnionOfSets
NSMutableSet* students = [NSMutableSet set];
for (int i = 0; i < 6; i++) {
TZPerson* student = [TZPerson new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@(18+i),
@"nick":@"Cat",
@"height":@(1.65 + 0.02*arc4random_uniform(6)),
};
[student setValuesForKeysWithDictionary:dict];
[students addObject:student];
}
NSLog(@"students = %@", [students valueForKey:@"height"]);
/*
1.69,
1.75,
1.71
*/
NSMutableSet* students1 = [NSMutableSet set];
for (int i = 0; i < 6; i++) {
TZPerson* student = [TZPerson new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@(18+i),
@"nick":@"Cat",
@"height":@(1.65 + 0.02*arc4random_uniform(6)),
};
[student setValuesForKeysWithDictionary:dict];
[students1 addObject:student];
}
NSLog(@"students1 = %@", [students1 valueForKey:@"height"]);
/*
1.69,
1.75,
1.65,
1.73,
1.71
*/
NSSet* nestSet = [NSSet setWithObjects:students, students1, nil];
NSArray* arr1 = [nestSet valueForKeyPath:@"@distinctUnionOfSets.height"];
NSLog(@"arr1 = %@", arr1);
/*
1.69,
1.75,
1.65,
1.73,
1.71
*/
KVC集合代理对象:一对多关系,可以通过一个key值映射多个方法或者变量
例一:person中的count属性跟key对应,当获取key的时候会根据count判断:
.h中:
@property (nonatomic, assign) NSUInteger count;
.m中:
- (NSUInteger) countOfBooks {
return self.count;
}
- (id) objectInBooksAtIndex:(NSUInteger)index {
return [NSString stringWithFormat:@"book %lu", index];
}
TZPerson* p = [TZPerson new];
p.count = 5;
NSLog(@"books = %@", [p valueForKey:@"books"]);
/*
books = (
"book 0",
"book 1",
"book 2",
"book 3",
"book 4"
)
*/
例二:key绑定数组:
.h:
@property (nonatomic, strong) NSMutableArray *penArr;
.m:
// 个数
- (NSUInteger) countOfPens {
return [self.penArr count];
}
// 是否包含这个成员对象
- (id) memberOfPens:(id)object {
return [self.penArr containsObject:object] ? object : nil;
}
// 迭代器
- (id) enumeratorOfPens {
return [self.penArr objectEnumerator];
}
TZPerson* p = [TZPerson new];
p.penArr = [NSMutableArray arrayWithObjects:@"pen0", @"pen1", @"pen2", @"pen3", nil];
NSSet* set = [p valueForKey:@"pens"];
NSLog(@"pens = %@", set);
/*
pens = {(
pen0,
pen1,
pen2,
pen3
)}
*/
主要注意的是用到了迭代器,我们可以自定义迭代器的便利顺序,例2中我们用的正序,我们也可以使用反序:reverseObjectEnumerator










网友评论