2012-08-21 11 views
11

この例は考案されていますが、私の要点を示しています。組み込み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のタイプにNSArrayのオブジェクトを有するNSDictionarys含有されます)。

キーフィールドはworkです。 work配列の最初のオブジェクトを取得するキーパスが必要です。

私はこれを行う場合:

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

を、私はそれぞれの名前を含む配列(上記の場合には、ソフトウェアエンジニア&アップル)を取得します。最初のオブジェクトを返すコレクション演算子などがありますか?ボーナスポイント、あなたがそれを行うための一つの方法はこれで、自分の質問に答えるためにSTART_DATEでも:)

答えて

15

まあの各作業をソートするキーのパスを開発することができた場合:

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)は、このキーパス構文にthis clever person

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

感謝を使用してください。

+0

を – Coughlin

+0

@PauldeLange _firstForKeyPathとは何ですか、プライベートAPIですか? – onmyway133

+0

プライベートAPIが使用されていない –

14

@PauldeLange - あなたの回答とリンクが役立ちました。
以下の簡単なバージョンは、NSArrayの上の予め規定された方法を意味上記「firstObject」で

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

(少なくともXcodeの6のように)余りに働きます。第二の目的が必要な場合は、次のように定義することができます。

@implementation NSArray (CustomKVOOperators) 

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

と使用:? `` `outerArrayObject```が親であることの場合には

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

良い発見と良い更新!これははるかに良い方法です。 –

+2

"このクラスはfirstObject操作を実装していません" – Injectios

+0

@Injectiosこれで解決したかもしれません。あなたの用途では、データオブジェクト(作業)が操作されている可能性がNSArrayではありません。 – Parmesh

関連する問題