Keypath для первого элемента во встроенном NSArray

Этот пример надуман, но он показывает мою точку.

Итак, если у меня есть граф объектов, как показано ниже:

{
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

(Это NSArray, содержащий NSDictionarys, которые имеют объект типа NSArray).

Поле ключа work. Я хочу, чтобы ключевой путь занял первый объект в массиве work.

Если я это сделаю:

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

Я получаю массив, содержащий каждое имя (в приведенном выше случае, Software Engineer и Apple). Есть ли оператор коллекции или что-то, чтобы вернуть первый объект? Бонусные баллы, если вы можете разработать Key Path для сортировки каждой работы с помощью start_date также:)

Ответ 1

Хорошо, чтобы ответить на мой собственный вопрос, один из способов сделать это:

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"];

Благодаря этому умному человеку.

Ответ 2

@PauldeLange - Ваш ответ и ссылки были полезными.
Следующая простая версия работает (по крайней мере, с Xcode 6)

id name = [work valueForKeyPath: @"[email protected]"];

В вышеприведенном "firstObject" ссылается на предопределенный метод на NSArray. Если требуется второй объект, вы можете определить следующее:

@implementation NSArray (CustomKVOOperators)

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

И используйте:

 id name = [work valueForKeyPath: @"[email protected]"];