13

辞書(クラスではなく単語のリスト)をNSStringsとしてNSSetにロードしています。次に、このセットにメッセージ-containsObject:someNSStringを繰り返し送信します。ただし、常にfalseを返します。私はそれをテストするためにいくつかのコードを書きました:

NSLog(@"Random from dictionary: %@", [dictionary anyObject]);
NSString *test = [NSString stringWithFormat:@"BEMIRED"];
NSLog(@"To match this word: %@", test);
if ([dictionary containsObject:test])
    NSLog(@"YES!");

ログに次のように表示されます。

Random from dictionary: BEMIRED
To match this word: BEMIRED

(「YES!」がありません)

CFShow(dictionary)を使用してみると、実際には文字列が含まれていることがわかります。例:

0 : <CFString 0xc3bd810 [0x1386400]>{contents = "BEMIRED"}
3 : <CFString 0xdf96ef0 [0x1386400]>{contents = "SUBJECTIFIED"}

誰かがここで私を助けてくれますか?ありがとう!

4

3 に答える 3

28

NSSetはisEqual:、オブジェクトの同等性をテストするために使用します。NSStringは、期待どおりに文字列比較を実行するためにオーバーライドします。次の単体テストに合格します。

- (void)testSetStrings
{
    NSSet *set = [NSSet setWithObject:@"String 1"];

    // I've used the UTF8 initializer to avoid any cleverness from reusing objects
    NSString *string1 = [[[NSString alloc] initWithUTF8String:"String 1"] autorelease];

    // Test the references/pointers are not the same
    STAssertTrue([set anyObject] != string1, nil);

    STAssertTrue([set containsObject:string1], nil);
}

2つの文字列のポインタ値が異なることがわかりますが、セットはcontainsObject:呼び出しに対してYESを返します。

だから私はあなたの文字列が実際には等しくないと思います。隠された空白または他の同様の問題をチェックします。

于 2011-08-12T10:17:24.417 に答える
0

-[NSSet containsObject:]、オブジェクトの同等性ではなく、ポインタ値のみをチェックしているようです(そのメソッドのドキュメントは非常に不足しています)。したがって-[NSSet member:]、代わりにを使用する必要があります。これisEqual:は、等しいと見なされるオブジェクトがセットに含まれているかどうかを確認するために使用します。

if ([dictionary member:test])
    NSLog(@"YES!");

編集:実際にはそれcontainsObject:も使用isEqual:しているようです。それらは、返すものが異なるように見えるだけです(しばらくcontainsObject:戻ると戻ります)。私はこの答えを文書化の目的のために残しておきます。BOOLmember:id

于 2011-08-12T08:36:25.723 に答える
0

さて、問題を解決しましたが、containsObjectメソッドとは何の関係もありませんでした。私がコメントしたように、私はここにあるDave DeLongs DDFileReaderを使用しました:Dave DeLongs DDFileReader

したがって、辞書全体でCFShowを使用すると、すべての単語の末尾に新しい行があることに気付きました。したがって、-readLineメソッドの代わりに、-readTrimmedLine(上記のファイルリーダーのボットメソッド)を使用しました。これで問題は解決しました。

今後のフォーラム訪問者のために、DarkDustとzoulが-containsObjectと-member(NSSetの両方のメソッド)について行った議論に注目したいと思います。どちらも-isEqualメソッドを使用していることがわかります。

于 2011-08-15T18:00:25.750 に答える