假设我有一个 NSArray
,每个项目都是一个 NSDictionary
,具有三个键 keyA、keyB 和 keyC - 每个都引用未知类型的对象 ( id)
.
如果我想编写一个方法来找到具有这三个键的给定元素,即
-(NSDictionary *) itemThatContainsKeys:(id)objectA and:(id)objectB and:(id)objectC
如果我通过 if([i objectForKey:(keyA) isEqualTo:objectA]
) 等简单地枚举和测试对象相等性,我会遇到麻烦吗?我将传递在字典初始化中设置的实际对象 - 即不是具有相同值但位置不同的字符串。
这是不好的做法吗? 有没有更好的方法可以在不创建数据库的情况下执行此操作?
最佳答案
您可以覆盖 isEqual 来为您的类型规定相等的概念。与其他语言相同的规则适用:
- 如果您提供 equals 的实现,您应该提供“hash”的实现
- “相等”的对象应该有相同的“散列”
- 等于应该是可传递的 -> 如果 A 等于 B,并且 B 等于 C,则 C 必须等于 A。
- 等于应该是双向的 -> 如果 A 等于 B,则 B 必须等于 A。
这将确保像 NSSet 这样的类中的可预测行为,这些类使用哈希来提高性能,并在发生冲突时回退到 equals on。
正如 Jason Whitehorn 指出的那样,Objective-C 还约定提供另一个 isEqualToMyType 方法以方便使用。
AppCode、EqualsBuilder、样板代码
如果有类似 Apache 的“EqualsBuilder”类的东西就好了,但与此同时 AppCode在为您实现这些方法方面做得很好。
关于iOS:枚举时对象相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210232/