代码优化(将2行代码合并为1行)

时间:2013-07-19 15:51:33

标签: ios objective-c

我尝试了一些组合,但似乎无法做到正确。我希望将第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 个答案:

答案 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个对象的数组,并使用这两种方法搜索第一个和最后一个对象。即使在查找最后一个对象时,块方法仍然比使用谓词更快。我猜是因为没有创建过滤数组而节省了。