将 NSSet 转换为数组

Convert NSSet into an Array

我将数据存储在使用关系的 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 不支持有序关系,我不能将有序排列用作解决方案的一部分。

我的建议是将关系声明为 non-optional native Swift type

@NSManaged public var children: Set<Node>

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

let sortedChildren = children.sorted{[=11=].dateAdded > .dateAdded}