代码之家  ›  专栏  ›  技术社区  ›  dontWatchMyProfile

如何在NSSet或NSArray中搜索具有特定属性特定值的对象?

  •  50
  • dontWatchMyProfile  · 技术社区  · 14 年前

    如何在NSSet或NSArray中搜索具有特定属性特定值的对象?

    type 财产。我想得到第一个 [theObject.type isEqualToString:@"standard"] .

    我记得对这类东西使用谓词是可能的,对吧?

    4 回复  |  直到 14 年前
        1
  •  80
  •   Shmidt    10 年前
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %@", @"standard"];
    NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicate];
    id firstFoundObject = nil;
    firstFoundObject =  filteredArray.count > 0 ? filteredArray.firstObject : nil;
    

    注意:这个概念

        2
  •  17
  •   NSResponder    14 年前

    您可以得到Jason和Ole所描述的过滤数组,但是因为您只需要一个对象,所以我将使用 - indexOfObjectPassingTest: (如果在数组中)或 -objectPassingTest: (如果它在一个集合中)并避免创建第二个数组。

        3
  •  15
  •   Carl Veazey    11 年前

    一般来说,我用 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)
    
        4
  •  4
  •   Jason Coco superfell    14 年前
    NSArray* results = [theFullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.type LIKE[cd] %@", @"standard"]];