swift 如何将关系配置为PersistentModel中的Set?

z9smfwbn  于 2023-10-15  发布在  Swift
关注(0)|答案(1)|浏览(113)

新的SwiftData框架在使用Array时可以成功运行,但在@Relationship中使用Set时会产生致命错误。为什么?为什么?

import Foundation
import SwiftData

@Model
final class Item {
    var timestamp: Date
    @Relationship(inverse: \Parent.items) var parent: Parent?
    
    init(timestamp: Date) {
        self.timestamp = timestamp
    }
}

@Model final public class Parent {
    var items: Set<Item>
}

SwiftData/SchemaCoreData.swift:907:致命错误:无法将关系链接到目标实体“Set”,因为在模型中找不到它:(<NSRelationshipDescription: 0x6000033085a0>),name items,isOptional 0,isTransient 0,entity Parent,renamingIdentifier items,validation predicate(),warnings(),versionHashModifier(null)userInfo { },destination entity(null),inverseRelationship(null),minCount 0,maxCount 1,isOrdered 0,deleteRule 1
在Xcode beta 15.0中测试。

uyto3xhc

uyto3xhc1#

正如https://www.avanderlee.com/swift/array-vs-set-differences-explained/所指出的,当项目的顺序不重要时,或者当你需要确保一个项目只出现一次时,你可以使用Set而不是Array。记住这两种类型都是值类型,其中数组可以保存两次值,而Set从不包含重复的值。
在我看来,你想让项目集成为一对多的关系?iOS 17,你可以让我成为标准的SwiftData项目。将标准重命名为IItem,并在下面插入两个模型。应该会有用

@Model
final class Item {
    var timestamp: Date
//    @Relationship(inverse: \Parent.items) var tags: [Parent]?
   //@Relationship(inverse: \Parent.items) var parent: Parent?
    @Relationship(inverse: \Parent.transactions)
       var parent: Parent?
    
    init(timestamp: Date) {
        self.timestamp = timestamp
    }
}

@Model final public class Parent {
    var items: MySet
    @Relationship(deleteRule: .cascade)
        var transactions: [Item] = []
    
    init(items: MySet, transactions: [Item]) {
        self.items = items
        self.transactions = transactions
    }
}

typealias MySet = Set<Int>
struct Cell: Codable {
    var classesEntieres : MySet = []
    var classesDemiA : MySet = []
    var classesDemiB : MySet = []
    var m : Int = -1
    var s : Int = -1
    var a : Int = -1
}

相关问题