如何在NSSet或NSArray中search具有特定属性的特定值的对象?
如何在NSSet或NSArray中search具有特定属性的特定值的对象?
例如:我有一个20个对象的NSSet,每个对象都有一个type
属性。 我想获得第一个对象,其中[theObject.type isEqualToString:@"standard"]
。
我记得有可能以某种方式使用谓词来处理这种东西,对吧?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %@", @"standard"]; NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicate]; id firstFoundObject = nil; firstFoundObject = filteredArray.count > 0 ? filteredArray.firstObject : nil;
注意:NSSet中第一个find的对象的概念是没有意义的,因为一个集合中对象的顺序是不确定的。
你可以像Jason和Ole所描述的那样得到被过滤的数组,但是因为你只需要一个对象,我可以使用- indexOfObjectPassingTest:
如果它在数组中)或者-objectPassingTest:
如果它在一个集合中),并且避免创build第二arrays。
一般来说,我使用indexOfObjectPassingTest:
因为我发现在Objective-C代码中表示我的testing比在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)
NSArray* results = [theFullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.type LIKE[cd] %@", @"standard"]];