カスタムクラスのオブジェクトで形成されたNSArray
があります。このクラスには、3つの(都市、州、郵便番号)文字列プロパティがあります。 array
からすべての一意の状態値を取得したいと思います。
NSPredicate
クラスを読みましたが、この場合の使い方はあまりできませんでした。私が見つけることができた唯一の例は、文字列操作でした。
誰かが私を助けてくれますか?
完全にシンプルなワンライナー:
NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
トリックは、NSArray
のvalueForKey:
メソッドです。配列(myArrayOfCustomObjects
)を反復処理し、各オブジェクトで-state
メソッドを呼び出し、結果の配列を作成します。次に、結果の状態の配列でNSSet
を作成して、重複を削除します。
IOS 5およびOS X 10.7から、これを実行できる新しいクラスNSOrderedSet
が追加されました。順序付きセットの利点は、重複を削除するだけでなく、相対的な順序を維持することです。
NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
keypaths を見てください。それらは非常に強力であり、私はほとんどの場合NSPredicateクラスの代わりにそれらを使用します。あなたの例でそれらを使用する方法は次のとおりです...
NSArray *uniqueStates;
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"];
valueForKeyの代わりにvalueForKeyPathを使用していることに注意してください。
以下に、より詳細な/工夫された例を示します...
NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil];
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil];
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil];
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil];
NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil];
NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]);
// OUTPUT
// Unique States:
// "california",
// "michigan",
// "new york"