我尝试了一些组合,但似乎无法做到正确。我希望将第2行和第3行合并为一行代码。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'SSM M51 Copperhead'"];
NSArray *searchResults1 = [self.weaponsArray filteredArrayUsingPredicate:predicate];
weapons = [searchResults1 objectAtIndex:0];
if(weapons.range > SSMrange)
SSMrange = weapons.range;
('武器'是一个班级。)
答案 0 :(得分:2)
weapons = [self.weaponsArray filteredArrayUsingPredicate:predicate][0];
但这并不会让你的代码更快。
答案 1 :(得分:2)
如何定义类似的方法:
- (Weapon*)firstWeaponMatchingPredicateWithFormat:(NSString*)format
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:format];
NSArray *searchResults1 = [self.weaponsArray filteredArrayUsingPredicate:predicate];
return (searchResults1.count > 0 ? [searchResults1 objectAtIndex:0] : nil);
}
致电:
Weapon *weapon = [self firstWeaponMatchingPredicateWithFormat:@"name == 'SSM M51 Copperhead'"];
答案 2 :(得分:1)
weapon = [[self.weaponsArray filteredArrayUsingPredicate:predicate] objectAtIndex:0];
答案 3 :(得分:1)
不需要创建一个带有过滤结果的数组对象,只能获取第一个对象并丢弃该集合。
如果您的目标是iOS 4.0或更高版本,NSArray
提供的功能可以获取第一个通过块测试的对象的索引。
NSUInteger indexOfObject = [self.weaponsArray indexOfObjectPassingTest:^(id obj, NSUInteger index, BOOL *stop) {
return [[obj valueForKey:@"name"] isEqualToString:@"SSM M51 Copperhead"];
}];
每个对象执行一次该块,当块返回YES
时,数组将停止处理。一旦知道对象的索引,就可以直接从self.weaponsArray
数组中获取值。只需确保检查NSNotFound
的返回值。
我尝试过滤1,000,000个对象的数组,并使用这两种方法搜索第一个和最后一个对象。即使在查找最后一个对象时,块方法仍然比使用谓词更快。我猜是因为没有创建过滤数组而节省了。