0

a をフィルタリングしNSMutableArrayて object( NSDictionary) を取得しています。次に、元の でこのオブジェクトのインデックスを取得したいと考えていますNSMutableArray。しかし、どういうわけか、指定されたインデックスは2147483647、その配列に項目が 5 つしかない場合です。

元の配列でフェッチされたオブジェクトのインデックスを取得する方法を教えてください。

predicate = [NSPredicate predicateWithFormat:@"data.resourceID == %@",addEvents[@"resourceID"]];
                result = [appDataMutable filteredArrayUsingPredicate:predicate];
                NSLog(@"%i",[appDataMutable indexOfObject:result]);
//...
 [appDataMutable replaceObjectAtIndex:[appDataMutable indexOfObject:result] withObject:resultDictionary]'
4

2 に答える 2

3

When an object is not found in an array, indexOfObject: returns NSNotFound, defined as

enum {NSNotFound = NSIntegerMax};

NSIntegerMax is 0x7fffffff, i.e. 2147483647.

于 2013-10-05T16:39:52.393 に答える
0
result = [appDataMutable filteredArrayUsingPredicate:predicate];
NSLog(@"%i",[appDataMutable indexOfObject:result]);

filteredArrayUsingPredicate:開始配列から単一のオブジェクトを返しません。元の配列内の 0 個以上のオブジェクト (つまり、述語に一致するオブジェクト) を含む別の配列を返します。

その配列には、元の配列内のオブジェクトの一部 (またはまったく含まれていません) が含まれています。元の配列には追加されず、以前にも存在しなかったため、元の配列内のオブジェクトの 1 つではありません。

そのため、元の配列にindexOfObject:フィルターダウンされた配列を求めると、結果が得られますNSNotFound。これは、あなたが見たものです。

ケビンが彼の回答のコメントで述べたように、解決策は、結果の配列が空かどうかを確認し (その を確認count)、その配列内のオブジェクトを使用することです。

あとがき

結果の配列にオブジェクトが 1 つしかないと予想される場合は、おそらくその条件をアサートする必要があります。そうでない場合は例外が発生します。(配列のカウントが正確に1 であるか、1以下であるかをアサートするかどうかを選択します。)

複数の一致のケースを処理したい場合は、enumerateObjectsUsingBlock:代わりに使用して、一致ごとに自分で述語を評価する必要があります。

于 2013-10-06T00:26:42.570 に答える