0

我尝试了一些组合,但似乎无法正确使用。我希望将第 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;

(“武器”是一类)。

4

4 回答 4

2
weapons = [self.weaponsArray filteredArrayUsingPredicate:predicate][0];

不过,这并不会真正让您的代码更快。

于 2013-07-19T15:53:15.993 回答
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'"];
于 2013-07-19T16:05:28.490 回答
1
weapon = [[self.weaponsArray filteredArrayUsingPredicate:predicate] objectAtIndex:0];
于 2013-07-19T16:08:07.043 回答
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 个对象的数组,并使用这两种方法搜索第一个和最后一个对象。即使在寻找最后一个对象时,块方法仍然比使用谓词更快。我猜是因为没有创建过滤数组。

于 2013-07-20T01:08:02.913 回答