2012-08-21 3 views
11

Dieses Beispiel ist erfunden, aber es zeigt meinen Punkt.Keypath für erstes Element in eingebettetem NSArray

Also, wenn ich ein Objekt Diagramm wie folgt aus:

{ 
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 

(Dies ist eine NSArray enthält NSDictionarys, die ein Objekt vom Typ NSArray haben).

Das Schlüsselfeld ist work. Ich möchte einen Schlüsselpfad, der das erste Objekt im Array work übernimmt.

Wenn ich dies tun:

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

ich einen Array jeden Namen, die (im obigen Fall, Software Engineer & von Apple). Gibt es einen Auflistungsoperator oder etwas, um das erste Objekt zurückzugeben? Bonuspunkte, wenn Sie einen Key Path entwickeln können jede Arbeit von start_date sortieren auch :)

Antwort

15

Nun meine eigene Frage zu beantworten, einen Weg, es zu tun, ist dies:

1) Definieren Sie die folgende Kategorie

@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) Verwenden Sie diese KeyPath Syntax

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

Dank this clever person.

+0

Im Fall von '' 'outerArrayObject''' ist, dass seine Eltern? – Coughlin

+0

@PauldeLange Was ist _firstForKeyPath, ist es private API? – onmyway133

+0

keine private API verwendet werden –

14

@PauldeLange - Ihre Antwort und Links waren hilfreich.
Die folgende einfachere Version funktioniert auch (zumindest von Xcode 6)

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

In dem obigen ‚Firstobject‘ bezieht sich auf die vordefinierte Methode auf NSArray.

@implementation NSArray (CustomKVOOperators) 

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

Und Verwendung: Wenn das zweite Objekt benötigt wird, können Sie die folgende definieren

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

Gut zu finden und ein gutes Update! Dies ist ein viel besserer Weg, es jetzt zu tun –

+2

Ich bekomme "diese Klasse implementiert nicht die FirstObject-Operation" – Injectios

+0

@Injectios Sie haben dies möglicherweise jetzt gelöst. In Ihrer Verwendung ist das Datenobjekt (Arbeit), das bearbeitet wird, wahrscheinlich kein NSArray. – Parmesh