Keypath for first element in embedded NSArray

后端 未结 2 1217
渐次进展
渐次进展 2020-12-16 01:52

This example is contrived, but it shows my point.

So, if I have an object graph like the following:

{
sex = male;
uid = 637650940;
work = ({
    empl         


        
相关标签:
2条回答
  • 2020-12-16 01:59

    @PauldeLange - Your answer and links were helpful.
    The following simpler version works too (at least as of Xcode 6)

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

    In the above 'firstObject' refers to the predefined method on NSArray. If the second object is needed, you can define the following:

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

    And use:

     id name = [work valueForKeyPath: @"employer.name.@secondObject”];
    
    0 讨论(0)
  • 2020-12-16 02:16

    Well to answer my own question, one way to do it is this:

    1) Define the following category

    @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) Use this KeyPath syntax

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

    Thanks to this clever person.

    0 讨论(0)
提交回复
热议问题