【问题标题】:Convert NSSet into an Array将 NSSet 转换为数组
【发布时间】:2021-08-21 09:23:19
【问题描述】:

我将数据存储在使用关系的 CoreData 实体中。默认情况下,toMany 类型关系的类型为NSSet。为了将此NSSet 按添加到此NSSet 的项目的顺序加载到表视图中,我需要将其转换为数组。我该如何实现这一目标?

NSManaged 子类生成:

extension Node {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Node> {
        return NSFetchRequest<Node>(entityName: "Node")
    }

    @NSManaged public var value: String?
    @NSManaged public var children: NSSet?
    @NSManaged public var parent: Node?


    @objc(addChildrenObject:)
    @NSManaged public func addToChildren(_ value: Node)

    @objc(removeChildrenObject:)
    @NSManaged public func removeFromChildren(_ value: Node)

    @objc(addChildren:)
    @NSManaged public func addToChildren(_ values: NSSet)

    @objc(removeChildren:)
    @NSManaged public func removeFromChildren(_ values: NSSet)
}

注意:由于 CloudKit 不支持有序关系,我不能将有序排列作为解决方案的一部分。

【问题讨论】:

  • 您要将关系转换为有序关系还是要将NSSet 排序为代码中的Array
  • 我想将NSSet 转换为一个数组(按照添加到NSSet 中的项目的顺序)。
  • @RajaKishan 不会创建 [NSSet?] 类型的数组。我正在尝试获取 [Node] 类型的数组
  • let arr = Array(children!) 试试这个
  • 那是你真正的问题吗?如果您需要维护添加项目的顺序,那么您需要在模型构建器中检查关系的 Ordered 复选框,或者添加一个跟踪顺序的属性,如计数器或日期属性。

标签: swift core-data nsarray nsset


【解决方案1】:

我的建议是将关系声明为非可选原生 Swift 类型

@NSManaged public var children: Set<Node>

要获得一个数组,只需sort 集合。使用 Swift Set,这很容易。由于集合根据定义是无序的,因此无论如何您都必须这样做才能获得固定顺序。假设你有一个dateAdded 属性,你可以写

let sortedChildren = children.sorted{$0.dateAdded > $1.dateAdded}

【讨论】:

  • 当我使用 CloudKit 时,我不能使用有序关系。不管怎样,对NSSet 进行排序会起作用吗?
  • 关系是无序的。 SetNSSet 的行为非常相似。包括 CloudKit 在内的核心数据非常适用于原生类型。
  • 为什么非可选,不是所有节点都必须有子节点(或父节点)?
  • @JoakimDanielson 我尽可能投票支持非可选的集合类型。检查nil 或空集没有区别。在 tree 中,您可能无论如何都会创建一个计算属性 var isLeaf : Bool { return children.isEmpty }。当然parent 节点必须是可选的,如果它可以是nil
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2011-06-08
  • 1970-01-01
相关资源
最近更新 更多