53

NSSetまたはNSArrayで、特定のプロパティに特定の値を持つオブジェクトを検索するにはどうすればよいですか?

例:20個のオブジェクトを持つNSSetがあり、すべてのオブジェクトにtypeプロパティがあります。を持っている最初のオブジェクトを取得したい[theObject.type isEqualToString:@"standard"]

どういうわけか、この種のものに述語を使用することが可能だったのを覚えていますよね?

4

4 に答える 4

80
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %@", @"standard"];
NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicate];
id firstFoundObject = nil;
firstFoundObject =  filteredArray.count > 0 ? filteredArray.firstObject : nil;

注意:セット内のオブジェクトの順序は定義されていないため、NSSetで最初に見つかったオブジェクトの概念は意味がありません。

于 2010-06-19T17:23:52.900 に答える
17

JasonとOleが説明したように、フィルター処理された配列を取得できますが、必要なオブジェクトは1つだけなので、 (- indexOfObjectPassingTest:配列内にある場合は)または-objectPassingTest:(セット内にある場合)を使用して、2番目の配列の作成を避けます。

于 2010-06-20T21:19:06.660 に答える
15

一般的に、構文indexOfObjectPassingTest:よりもObjective-Cコードでテストを表現する方が便利だと思うので使用します。NSPredicate簡単な例を次に示します(integerValue実際にはプロパティであると想像してください)。

NSArray *array = @[@0,@1,@2,@3];
NSUInteger indexOfTwo = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return ([(NSNumber *)obj integerValue] == 2);
}];
NSUInteger indexOfFour = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return ([(NSNumber *)obj integerValue] == 4);
}];
BOOL hasTwo = (indexOfTwo != NSNotFound);
BOOL hasFour = (indexOfFour != NSNotFound);
NSLog(@"hasTwo: %@ (index was %d)", hasTwo ? @"YES" : @"NO", indexOfTwo);
NSLog(@"hasFour: %@ (index was %d)", hasFour ? @"YES" : @"NO", indexOfFour);

このコードの出力は次のとおりです。

hasTwo: YES (index was 2)
hasFour: NO (index was 2147483647)
于 2013-08-16T14:25:22.070 に答える
4
NSArray* results = [theFullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.type LIKE[cd] %@", @"standard"]];
于 2010-06-19T17:23:42.437 に答える