Pau*_*nge 11 objective-c key-value-coding
这个例子是人为的,但它表明了我的观点.
所以,如果我有一个如下的对象图:
{
sex = male;
uid = 637650940;
work = ({
employer = {
id = 116420715044499;
name = "Software Engineer";
};
"end_date" = "0000-00";
"start_date" = "0000-00";
}, {
employer = {
id = 188733137832278;
name = "Apple";
};
});
},
//Some more objects
Run Code Online (Sandbox Code Playgroud)
(这是一个包含NSDictionarys的NSArray,它具有NSArray类型的对象).
关键领域是work.我想要一个关键路径,它将获取work数组中的第一个对象.
如果我这样做:
NSArray* work = [outerArrayObject objectForKey: @"work"];
id name = [work valueForKeyPath: @"employer.name"];
Run Code Online (Sandbox Code Playgroud)
我得到一个包含每个名字的数组(在上面的例子中,软件工程师和Apple).是否有一个集合运算符或某些东西可以返回第一个对象?如果您可以通过start_date开发一个关键路径来对每个工作进行排序,那么奖励积分:)
Pau*_*nge 17
那么回答我自己的问题,一种方法是:
1)定义以下类别
@implementation NSArray (CustomKVOOperators)
- (id) _firstForKeyPath: (NSString*) keyPath {
NSArray* array = [self valueForKeyPath: keyPath];
if( [array respondsToSelector: @selector(objectAtIndex:)] &&
[array respondsToSelector: @selector(count)]) {
if( [array count] )
return [array objectAtIndex: 0];
else
return nil;
}
else {
return nil;
}
}
@end
Run Code Online (Sandbox Code Playgroud)
2)使用此KeyPath语法
NSArray* work = [outerArrayObject objectForKey: @"work"];
id name = [work valueForKeyPath: @"@first.employer.name"];
Run Code Online (Sandbox Code Playgroud)
感谢这个聪明的人.
小智 15
@PauldeLange - 您的回答和链接很有帮助.
以下更简单的版本也适用(至少从Xcode 6开始)
id name = [work valueForKeyPath: @"employer.name.@firstObject”];
Run Code Online (Sandbox Code Playgroud)
在上面的'firstObject'中指的是NSArray上的预定义方法.如果需要第二个对象,则可以定义以下内容:
@implementation NSArray (CustomKVOOperators)
- (id) secondObject {
return [self count] >=2 ? self[1] : nil;
}
@end
Run Code Online (Sandbox Code Playgroud)
并使用:
id name = [work valueForKeyPath: @"employer.name.@secondObject”];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6321 次 |
| 最近记录: |