これらはCocoa配列オブジェクト(NSArrayのインスタンス)であり、C配列やC ++ベクトルではありません。また、Objective-Cには演算子のオーバーロードがないことに注意してください。オブジェクトでできることは、オブジェクトを渡し、変数に格納し、メッセージを送信することだけです。
そのため、Array-subscript演算子はObjective-Cオブジェクトでは間違っています。Objective-Cオブジェクトへのポインターを逆参照することは言語的にも有効ではないと思うので、このコードはコンパイラエラーを与えるはずです。しかし、私は覚えていないかもしれません。実行時に到達した場合、配列オブジェクトの終わりを超えてメモリにアクセスしているため、遅かれ早かれそのコードはクラッシュします。
objectAtIndex:
(2013年からの編集:Objective-Cはオブジェクトの添え字をサポートするようになりました。これは最終的に適切なメッセージに変換されreplaceObjectAtIndex:withObject:
ます。したがって、質問のコードは実際に機能しますが、配列を単純にウォークする適切な方法ではありませんが、 2つのアレイを比較することははるかに少ないです。)
NSArrayオブジェクトからそのインデックスによってオブジェクトを取得する適切な方法は、array-subscript演算子を使用するのではなく、配列オブジェクトに次のobjectAtIndex:
メッセージを送信することです。
[myArray objectAtIndex:i]
配列オブジェクトの要素を反復処理する適切な方法は、他の何か(可変配列内のオブジェクトの置換など)のインデックスが実際には必要ない場合、直接ループすることです(これは「高速列挙」と呼ばれます)。 )::
for (MyObject *myObject in myArray) {
…
}
NSArrayは、objectEnumerator
とreverseObjectEnumerator
にも応答します。これらは、同様に反復可能なオブジェクトを返します。2つのうち、reverseObjectEnumerator
配列を直接反復して前方に反復できるため、新しいコードでより便利です。どちらも、高速列挙が存在する前に最も役立ちました。そのコードは次のようになりました。
NSEnumerator *myArrayEnum = [myArray objectEnumerator];
MyObject *myObject;
while ((myObject = [myArrayEnum nextObject])) {
…
}
(はい、それは条件の割り当てです。意図的に、したがって余分()
です。私たちは当時大胆にコーディングしましたね?)
isEqualToArray:
ただし、 Williham Totlandが提案したように、実行していることについては、配列の1つにメッセージを送信する可能性が高くなります。
BOOL theyAreEqual = [myFirstArray isEqualToArray:mySecondArray];
これにより、両方の配列の長さが同じになり、両方をロックステップでウォークして、isEqual:
オブジェクトの各ペアに送信します。YES
すべてのisEqual:
メッセージが返された場合に返されますYES
; NO
そうでなければ。配列には異なるオブジェクトが含まれる場合がありますが、各ペアが等しい限り、配列自体は等しくなります。
これは、オブジェクトの同等性が必要であることを前提としています。メッセージYES
を送信してもう一方のオブジェクトを渡すときに一方が応答する場合、2つの別々のオブジェクトは等しくなります。isEqual:
オブジェクトのIDを比較する場合は、自分でロックステップループを実行して、次を使用する必要があります==
。
BOOL arraysContainTheSameObjects = YES;
NSEnumerator *otherEnum = [otherArray objectEnumerator];
for (MyObject *myObject in myArray) {
if (myObject != [otherEnum nextObject]) {
//We have found a pair of two different objects.
arraysContainTheSameObjects = NO;
break;
}
}
しかし、それはありそうにありません。ほとんどの場合、私はアイデンティティではなくオブジェクトの同等性をテストしたかったので、私が望んでいたのはそうisEqualToArray:
です。