iOS:枚举时对象相等

标签 ios objective-c cocoa-touch

假设我有一个 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/

相关文章:

ios - 返回 WF : _WebFilterIsActive returning: NO on device 的 MP3 流

ios - 在其他两个 View 之间垂直居中

ios - UITableViewController 不会用 NSFetchedResultsControllerDelegate + UISearchBarDelegate 更新

ios - EXC_BAD_ACCESS 属性崩溃的 getter 方法

iphone - UITableView 被拖动时,performSelector 无法运行?

ios - View Controller Programming Guide 中的这张图片中的虚线代表什么?

javascript - 在 IOS 中进行用户交互之前,Ajax 调用无法正常工作

objective-c - c 文件的 objective-c 包装器

ios - 禁用 MFMessageComposeViewController 的自定义外观

ios - 自动展开 UITableView - NSRangeException