【问题标题】:Realm Swift subclassing领域 Swift 子类化
【发布时间】:2024-05-22 07:05:02
【问题描述】:

我有两个模型,我正在尝试使用 RealmSwift 在 swift 中进行子类化

模型 1:用户

@objcMembers class User: Object, Codable {

    dynamic var id: Int = 0
    dynamic var username: String = ""
    dynamic var email: String = ""
    dynamic var counts: Counts = Counts(follows: 0, followed_by: 0)

    convenience init(id: Int, username: String, email: String, counts: Counts) {
        self.init()
        self.id = id
        self.username = username
        self.email = email
        self.counts = counts
    }    
}

class Counts: Codable {
    let follows: Int
    let followed_by: Int

    init(follows: Int, followed_by: Int) {
        self.follows = follows
        self.followed_by = followed_by
    }
}

这里我创建了一个继承 codable 的模型,因为我使用的是 Swift 4 新的解码方法。这个模型工作正常。我可以去添加一个用户并阅读它。所以这样做很好:

let newUser = User(id: 1, username: "user1", email: "user1@gmail.com", counts: Counts(follows: 100, followed_by: 500000000))

RealmService.shared.write(newUser)

现在我正在尝试创建一个名为 Friend 的模型,它有一个从 User 继承的字段

模型 2:朋友

@objcMembers class Friend: Object {

    dynamic var user: User = User(id: 0, username: "", email: "", counts: Counts(follows: 0, followed_by: 0))
    dynamic var dateAdded: Date = Date(timeIntervalSinceNow: 0)

    convenience init(user: User, dateAdded: Date = Date(timeIntervalSinceNow: 0)) {
        self.init()
        self.user = user
        self.dateAdded = dateAdded
    }
}

当我这样做并加载我的应用程序时,我会得到一个 SIGBART,它会突出显示我对领域的初始化:let realm = RealmService.shared.realm

当我删除我的朋友模型时,应用程序运行良好。

如何在 Realm 中正确子类化?

【问题讨论】:

    标签: swift realm swift4 realm-mobile-platform


    【解决方案1】:

    您不能将属性声明为类型是其他 Realm 子类的普通 Swift 属性。你要找的是many-to-one relationship

    多对一关系必须声明为可选项,并且不能提供默认值

    @objcMembers class Friend: Object {
    
        dynamic var user: User?
        dynamic var dateAdded: Date = Date()
    
        convenience init(user: User, dateAdded: Date = Date()) {
            self.init()
            self.user = user
            self.dateAdded = dateAdded
        }
    }
    

    不相关,但是当你想创建一个代表当前时间的Date对象时,只需调用Date的默认空初始化器,它会为你做这件事,它比Date(timeIntervalSinceNow: 0)短得多。

    【讨论】:

    • 这修复了我的 SIGBART 错误,但它给了我这个运行时错误:--Migration is required due to the following errors: - Property 'Friend.user' has been added." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: - Property 'Friend.user' has been added
    • 这是一个完全不同的问题。您必须将migration block 添加到您的 AppDelegate。我还建议您阅读完整的 Realm 文档,因为您似乎刚刚开始使用 Realm,它包含许多对初学者有用的信息。