web-dev-qa-db-ja.com

配列に特定のオブジェクトが含まれているかどうかを確認する(iOS)

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

私の現在の機能は次のとおりです。

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

    if (![myMutableArray containsObject:parameter]) {

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

    } else {

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

    }
}
15
iosdevrocks

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

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

31
Rohan Agarwal
if (![arrList containsObject:arrObj]) {
    // do something
}

containsObject:

16
Darshit Shah

最初に、この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型ではない場合、変換する必要があります。

7
Nirav

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

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

[〜#〜] edit [〜#〜]

配列の変数名はおそらくタイプミスであるようです。

  • myMutableArray
  • myMutbaleArray
2
Attila H

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

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

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

そして、0は偽です

1
mprivat