0

いくつかの組み合わせを試しましたが、うまくいかないようです。2 行目と 3 行目を 1 行のコードに結合しようとしています。

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 に答える
1

最初のオブジェクトを取得してコレクションを破棄するためだけに、フィルタリングされた結果で配列オブジェクトを作成する必要はありません。

iOS 4.0 以降をターゲットにしている場合NSArray、ブロックを介してテストを通過した最初のオブジェクトのインデックスを取得する機能を提供します。

NSUInteger indexOfObject = [self.weaponsArray indexOfObjectPassingTest:^(id obj, NSUInteger index, BOOL *stop) {
  return [[obj valueForKey:@"name"] isEqualToString:@"SSM M51 Copperhead"];
}];

ブロックはオブジェクトごとに 1 回実行され、ブロックが戻ると配列の処理が停止しますYES。オブジェクトのインデックスがわかれば、self.weaponsArray配列から直接値を取得できます。の戻り値を確認してくださいNSNotFound

1,000,000 個のオブジェクトの配列をフィルタリングし、2 つのアプローチを使用して最初と最後のオブジェクトの両方を検索してみました。最後のオブジェクトを探す場合でも、述語を使用するよりもブロック アプローチの方が高速でした。フィルター処理された配列を作成しないという節約のためだと思います。

于 2013-07-20T01:08:02.913 に答える
1
weapon = [[self.weaponsArray filteredArrayUsingPredicate:predicate] objectAtIndex:0];
于 2013-07-19T16:08:07.043 に答える