NSSet containsObject 不工作?

Posted

技术标签:

【中文标题】NSSet containsObject 不工作?【英文标题】:NSSet containsObject Not Working? 【发布时间】:2012-06-21 18:36:20 【问题描述】:

我正在尝试在将注释添加到数组之前检查它是否存在。 我不明白为什么 [visibleAnnotations containsObject:annotation] 总是返回 False。

MKMapRect mRect = self.locationView.visibleMapRect;
NSSet *visibleAnnotations =[self.locationView annotationsInMapRect:mRect];
NSLog(@"Annotation in Rect %@",visibleAnnotations);

for(NSArray * obj in JSON)
                coordinates.latitude=[[obj valueForKey:@"Latitude"] doubleValue];
                coordinates.longitude=[[obj valueForKey:@"Longitude"] doubleValue];
                NSString *title=[NSString stringWithFormat:@"%@",[obj valueForKey:@"DeviceId"]];
                MapAnnotation *annotation = [[MapAnnotation alloc] initWithTitle:title andCoordinate:coordinates] ;

                NSLog(@"New Annotation %@",annotation);

                if ([visibleAnnotations containsObject:annotation ]) 
                    //[addPins addObject:annotation];
                    NSLog(@"Contains obj");
                
                [addPins addObject:annotation];
                [annotation release];
            

缩放至仅显示 1 个注释。

 Annotation in Rect (<MapAnnotation: 0x1cd80720>)
 New Annotation <MapAnnotation: 0x1cd79410>

谢谢

【问题讨论】:

您创建一个新的注释对象并立即检查它是否已经在您的集合中。不可能。 【参考方案1】:

如果您在创建 MapAnnotation 实例并将其添加到集合后从不更改它们的属性,则可以覆盖该类的 hashisEqual: 方法以获得您在此处寻找的行为.

NSSet 使用这两种方法来测试对象;如果您重新定义 isEqual: 以比较 MapAnnontation 对象中包含的值,而不是对象本身的标识,则集合会将它们视为相等。

【讨论】:

完美,我想我是在尝试做某事而没有完全理解它。谢谢【参考方案2】:

因为您正在创建一个新对象,并且因为它是新对象,所以它显然不在您的集合中。

您需要检查集合中的每个对象,看看它是否与您的新对象相等。

【讨论】:

什么? containObject: 不就是这样做的吗? 不,它会检查它是否包含这个特定的对象,而不是与这个对象等效的对象。 很确定你弄错了:***.com/questions/8410606/…

以上是关于NSSet containsObject 不工作?的主要内容,如果未能解决你的问题,请参考以下文章

归档后比较对象

NSArray中containsObject的用法

NSArray中containsObject的用法

在 iOS 上加载 NSString 类失败,而 NSSet 和其他工作?

在 iOS 上加载 NSString 类失败,而 NSSet 和其他工作?

将排序的 NSManagedObjects 重新分配给 NSSet