6


我想要一个简单的 NSSet,它加载了一些 NSNumber,然后找出这些数字是否已经添加到集合中。当我这样做时:

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

6

当您使用 NSArray 时,您需要比较值而不是对象本身。您可以使用 NSMutableIndexSet,而不是使用 NSArray。这使您可以用更少的步骤来比较这些值。

//during init, add some numbers
NSMutableIndexSet *tSet = [[NSMutableIndexSet alloc] init];
NSUInteger exampleValue = 7;
[tSet addIndex:exampleValue];
exampleValue = 42;
[tSet addIndex:exampleValue];

//...later on
//look to see if numbers are there
if ([tSet containsIndex:7]){
    NSLog(@"7 exists!");
}
if ([tSet containsIndex:8]){
    NSLog(@"8 exists!");
}

输出:7 存在!

于 2015-06-11T00:56:02.117 回答
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

问题是,您正在检查是否是num1num2一个对象。他们不是。它们只是具有相同的值,但它们是具有相同值的两个不同对象。

因此,您要检查的member是它们在内存中是否具有相同的地址。

编辑:您应该使用compare检查数字的值是否相同!

于 2011-11-08T14:47:55.967 回答
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 回答