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