Stu*_*art 4 equality objective-c nsset ipad ios
我有一个NSSet包含数千个NSValue对象(包装CGPoints).我想很快找到一个给定的CGPoint值是否存在于NSSet.在我看来member:,一个NSSet可能在这里完成工作的方法,除了它使用检查相等性isEqual:.NSValue对象使用isEqualToValue:,所以当我执行代码时:
[mySet member:valueToCheck];
Run Code Online (Sandbox Code Playgroud)
它实际上导致Xcode崩溃.
1)是否有某种方法可以使用自定义相等性检查来使NSValue对象工作?
2)这是否是最好的方法(即首先是member:足够快)?场景是我有一个NSSet包含大量代表屏幕(iPad)像素的点.后来我需要以每秒数千点的速度轰击那一组,看看它们是否存在于集合中.我的方法似乎很难实现这一点.我想创建类似于一个巨大的二维位数组的东西,每个索引代表屏幕上的一个像素.一旦我知道我正在测试的那个点,我就可以直接跳到阵列中的那一点并检查1或0 ......这听起来好不好?
谢谢
Dav*_*ong 10
你能把它变成一个简单的可重复的案例吗?例如,我刚试过:
NSValue *v = [NSValue valueWithCGPoint:CGPointMake(1, 1)];
NSSet *s = [NSSet setWithObject:v];
NSLog(@"%@", [s member:[NSValue valueWithCGPoint:CGPointMake(1, 1)]]);
Run Code Online (Sandbox Code Playgroud)
但它的工作正常.
编辑
-isEqual: 不是问题:
NSValue *v1 = [NSValue valueWithPoint:NSMakePoint(1, 1)];
NSValue *v2 = [NSValue valueWithPoint:NSMakePoint(1, 1)];
NSLog(@"%d", [v1 isEqual:v2]); //logs "1"
Run Code Online (Sandbox Code Playgroud)
-hash 不是问题:
NSLog(@"%d", ([v1 hash] == [v2 hash])); //logs "1"
Run Code Online (Sandbox Code Playgroud)
它们是不同的对象:
NSLog(@"%d", (v1 != v2)); //logs "1"
Run Code Online (Sandbox Code Playgroud)
问题出在您的代码中.尝试清洁和重建.
| 归档时间: |
|
| 查看次数: |
3912 次 |
| 最近记录: |