11

这个例子是人为的,但它表明了我的观点。

所以,如果我有一个如下的对象图:

{
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

(这是一个包含 NSDictionarys 的 NSArray,它有一个 NSArray 类型的对象)。

关键字段是work。我想要一个键路径,它将采用work数组中的第一个对象。

如果我这样做:

NSArray* work = [outerArrayObject objectForKey: @"work"];
id name = [work valueForKeyPath: @"employer.name"];

我得到一个包含每个名称的数组(在上述情况下,软件工程师和苹果)。是否有集合运算符或返回第一个对象的东西?如果您可以开发一个关键路径来按 start_date 对每件作品进行排序,则可以加分:)

4

2 回答 2

18

@PauldeLange - 您的回答和链接很有帮助。
以下更简单的版本也可以(至少从 Xcode 6 开始)

id name = [work valueForKeyPath: @"employer.name.@firstObject”];

上面的'firstObject'指的是NSArray上的预定义方法。如果需要第二个对象,您可以定义以下内容:

@implementation NSArray (CustomKVOOperators)

- (id) secondObject {
    return [self count] >=2 ? self[1] : nil;
}
@end

并使用:

 id name = [work valueForKeyPath: @"employer.name.@secondObject”];
于 2015-05-06T02:10:30.640 回答
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

2) 使用这个 KeyPath 语法

NSArray* work = [outerArrayObject objectForKey: @"work"];
id name = [work valueForKeyPath: @"@first.employer.name"];

感谢这个聪明的人

于 2012-08-21T12:42:16.763 回答