【问题标题】:Transferring items from NSArray to NSSet for NSManagedObject将项目从 NSArray 传输到 NSManagedObject 的 NSSet
【发布时间】:2011-08-17 20:23:02
【问题描述】:

两个相关问题:

  1. 当您使用[NSSet setWithArray:]时,它会自动为您删除重复对象吗?

  2. 您如何准确地告诉NSSet 您想要“复制”的含义是什么? IE。如果你有一堆“大学课程”对象,每个对象都有一个名称和部分编号,并且你想转移到一个 NSSet,只保留一个给定名称的大学课程(例如,如果你有三个部分微积分,你怎么告诉它只保留一个微积分部分,即使它们的部分编号不同,所以默认情况下它们不会被认为是相同的)。

谢谢!让我知道这个问题是否不清楚。我很难找到一种表达方式。

编辑:这个问题是 NSManagedObjects 特有的,它的isEqual: 方法不能被覆盖。

【问题讨论】:

    标签: objective-c ios nsarray duplicates nsset


    【解决方案1】:
    1. 来自documentation

      如果同一个对象在数组中出现多次,则添加 只返回一次。

    2. 这里使用-isEqual: 方法(和-hash 方法)在整个Cocoa 中确定平等。如果您希望两个自定义对象被视为相等,则应适当地覆盖它们,并且必须同时覆盖它们。通常使用这些对象,以便可以将真正等效且通常可互换(但是单独的对象)的对象视为如此。在您的示例中,听起来大学课程对象确实是“不同的”(即,它们代表不同的课程,即使它们可能共享相同的整体“微积分”主题),因此将这些对象实例称为“相等”似乎有问题如果这是一个大型项目/代码库。在您的情况下,您可能会考虑将对象一个一个地添加到集合中,并在添加时进行自己的比较,以确保您获得每个“主题”之一。

    【讨论】:

    • 对不起,这是一个不好的例子,这只是我想出来的。我可以覆盖 isEqual,并将查看 hash 函数。以前没听说过。 (显然是 iOS 的新手)。
    • @Mason:酷。覆盖时,通常很容易传递您用来进行相等区分的任何内部数据的哈希值,例如带有课程名称的字符串的哈希值。对于“相等”的对象,散列需要相同,但它不必是唯一的。
    • 呃哦,增加了复杂性。我使用的对象是 NSManagedObjects,所以覆盖isEqual: 是非法的。我想这会稍微改变这个问题。有什么建议吗?
    • @Mason:是的,在添加到集合时做你自己的独特化。 :) Core Data 控制托管对象的相等性,因此您无法重新定义相等的含义。我会在对象上实现您自己的自定义-compareMe 方法,然后当您手动循环遍历数组,将对象添加到集合中时,使用内部循环检查集合中已有的任何内容是否与您的新对象比较相同方法。可能有一种方法可以简化这些循环,但不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多