18

特定の配列に特定のオブジェクトが含まれているかどうかを確認し、含まれている場合はそのオブジェクトを削除する必要があります。そのオブジェクトを取得していない場合、関数はそれを配列に追加することになっています。問題は、チェック ステートメントが常に false を返すため、オブジェクトが常に追加されることです。

これが私の現在の機能です:

- (void) myFunction:(NSString *)parameter {

    if (![myMutableArray containsObject:parameter]) {

        [myMutableArray addObject:parameter];
        NSLog(@"%@ added", parameter);

    } else {

        [myMutableArray removeObject:parameter];
        NSLog(@"%@ deleted", parameter);

    }
}
4

5 に答える 5

32

containsObjectは、配列内の各オブジェクトに対してisEqualを呼び出しています。どのタイプのオブジェクトをチェックしていますか?カスタムオブジェクトの場合は、メソッドisEqualをオーバーライドして実装します。

オブジェクトの値を確認しようとしていると思いますが、containsObjectは実際にはisEqualを呼び出しており、実際の値ではなく、オブジェクトへの参照を比較しています。

于 2013-01-16T19:23:26.873 に答える
19
if (![arrList containsObject:arrObj]) {
    // do something
}

含むオブジェクト:

于 2014-03-04T05:45:56.933 に答える
7

最初に、この に追加するデータまたはオブジェクトのタイプを確認する必要がありますmyMutableArray。メソッドによると、引数を渡した文字列型の可変配列をチェックインしていますparameter。int または float 配列が含まれている可能性があります。

配列に型キャストの問題がある可能性があります。STRING型のデータの場合、このような別の方法を使用できます。

- (void) myFunction:(NSString *)parameter {

for (int i = 0 ; i < [myMutableArray count ] ; i++) {


    if (![[myMutableArray objectAtIndex:i] isEqualToString:parameter]) {
        [myMutableArray addObject:parameter];
        NSLog(@"%@ added", parameter);
    }
    else{
        [myMutableArray removeObject:parameter];
        NSLog(@"%@ deleted", parameter);
    }
}

}

これがあなたを助けることを願っています。オブジェクトが NSString のタイプでない場合は、変換する必要があります。

于 2013-01-16T19:58:53.297 に答える
2

isEqual:カスタムクラスに実装する必要があります。デフォルトでは、2 つのオブジェクトは、同じ参照を共有している場合にのみ同一です。

また、可変配列を使用する前に必ず初期化してください。

編集

配列の変数名のタイプが間違っている可能性が高いようです。

  • myMutableArray
  • myMutbaleArray
于 2013-01-16T19:21:04.790 に答える
1

おそらくを初期化するのを忘れたでしょうNSMutableArray。初期化されていない場合、addObjectメッセージをnilオブジェクトに送信しますが、これは効果がなく、配列には以前に追加したものが含まれることはありません...

もちろん、配列がnilの場合、containsチェックは常にfalseを返します。Objective-Cのドキュメントによると:

メソッドがオブジェクト、任意のポインタ型、sizeof(void *)以下のサイズの整数スカラー、float、double、long double、またはlong longを返す場合、nilに送信されるメッセージは0を返します。 。

そして0は偽です

于 2013-01-16T19:23:26.590 に答える