6


いくつかの NSNumbers がロードされた単純な NSSet が必要であり、それらの番号がセットに既に追加されているかどうかを確認します。私がこれを行うとき:

NSMutableSet *set = [[NSMutableSet alloc] init];
NSNumber *num1 = [NSNumber numberWithInt:5];
NSNumber *num2 = [NSNumber numberWithInt:5];
[set addObject:num1];
if([set member:num2]){
   // something...
}

問題は、それらの数値が同じであっても、メンバーが常に nil (false の場合) を返すことです。isEqual メソッドは true を返します。そう

if([num1 isEqual:num2]){
   // correct
}

動作します...
ドキュメントでは、メンバーメソッドがisEqualを使用していることを読んだので、何が問題なのかわかりません...アドバイスをありがとう。

4

4 に答える 4

4

オブジェクトではなく、NSNumbers の値を比較する必要があります。

使用できますobjectsPassingTest:

例:

NSMutableSet *set = [[NSMutableSet alloc] init];
NSNumber *num1 = [NSNumber numberWithInt:5];
NSNumber *num2 = [NSNumber numberWithInt:5];
NSNumber *num3 = [NSNumber numberWithInt:3];
[set addObject:num1];

NSSet *filteredSet;
filteredSet = [set objectsPassingTest:^(id obj,BOOL *stop){
    return [obj isEqualToNumber:num2];
}];
NSLog(@"Contains num2: %@", (filteredSet.count == 1) ? @"YES" : @"NO");

filteredSet = [set objectsPassingTest:^(id obj,BOOL *stop){
    return [obj isEqualToNumber:num3];
}];
NSLog(@"Contains num3: %@", (filteredSet.count == 1) ? @"YES" : @"NO");

NSLog 出力:

Contains num2: YES
Contains num3: NO

または、述語の使用が必要な場合:

filteredSet = [set filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", num2]];
NSLog(@"Contains num2: %@", (filteredSet.count == 1) ? @"YES" : @"NO");

filteredSet = [set filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", num3]];
NSLog(@"Contains num3: %@", (filteredSet.count == 1) ? @"YES" : @"NO");
于 2011-11-08T15:25:31.987 に答える
2

実行するとHelloワードがログに書き込まれるため、コードは機能します

 NSMutableSet *set = [[NSMutableSet alloc] init];
 NSNumber *num1 = [NSNumber numberWithInt:5];
 NSNumber *num2 = [NSNumber numberWithInt:5];
 [set addObject:num1];
 if([set member:num2]){
     NSLog(@"Hello, world");
  }
于 2013-02-18T17:10:35.827 に答える