1. ホーム
  2. cocoa

[解決済み] NSStringインスタンスがNSArrayに含まれるかどうかをチェックする。

2023-06-30 14:28:25

質問

文字列の配列を持っていて、ある文字列がその配列に含まれているかどうかを調べたいのです。もし私が containsObject : メッセージを使用すると、正しい結果を得ることができます。すべての NSString オブジェクトはすべて同じオブジェクトを指しているのでしょうか?あるいは、なぜ containsObject が機能しているのでしょうか?

NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
  //DO SOMETHING
}

どのように解決するのですか?

はい、ハードコードされた NSStrings (文字列リテラル) (つまり、任意の @"..." は、プロセスが実行されている間、無期限に存在する文字列に変換されます。

しかし NSArray 's containsObject: メソッド呼び出し isEqual: を呼び出すので、そのオブジェクトに対して であっても、動的に生成された文字列 のような [NSString stringWithFormat:@"%d", 2] が返されます。 YES を返します。

これは、NSStringの isEqual: (正確にはその isEqualToString: ) メソッドを実装しています。 内容認識 (ポインタの同一性比較に対して) を返すように実装されており、その結果 YES を返します。これは、いつどのように作成されたかに関わらず、(比較時に)全く同じ文字の並びを含む文字列のペアに対してです。

等しい (ポインターの) 同一性をチェックするには、配列を列挙し、を介して比較する必要があります。

NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
    if (someString == yourString) {
        identicalStringFound = YES;
        break;
    }
}

(これは、ほとんどの場合、望んでいないでしょうが)。

あるいはもっと便利な方法で

BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;

(これもいらない可能性が高い)。


総括する。

で、肯定的な返事をもらっている理由は containsObject: NOT というのは、リテラル文字列は同じ定数インスタンスを共有しているからです。 しかし というのは containsObject: というのは、慣習的に isEqual: を呼び出します。

の(短い)ドキュメントを読むとよいでしょう。 isEqual: NSObject プロトコル .