繁体   English   中英

RealmSwift初始值设定项:在super.init调用之前自行使用

[英]RealmSwift initializer: self used before super.init call

import RealmSwift
import Realm

public class Card : Object {
    var username : String
    var firstName : String
    var lastName : String


    init?(dictionary: [String:Any]?) {
        guard let dictionary = dictionary , let username = dictionary["username"] as? String else { return else}

        self.username = username
        self.firstName = firstName 
        self.lastName = lastName
    }

    required public init() {
        fatalError("init() has not been implemented")
    }

    required public init( realm: RLMRealm, schema: RLMObjectSchema) {
        fatalError("init(realm:schema:) has not been implemented")
    }

    required public init( value: Any, schema: RLMSchema) {
       fatalError("init(value:schema:) has not been implemented")
    }
}

我得到:

在super.init调用之前使用“自我”

我上课正常。 添加RealmSwift之后,我遇到了这些错误。 如果我添加super.init()它会抱怨:

super.init调用未初始化属性“ self.username”

因为您的属性是字符串。

苹果文档 ...

设置存储属性的初始值

类和结构必须在创建该类或结构的实例时将其所有存储的属性设置为适当的初始值。 存储的属性不能处于不确定状态。 您可以在初始化程序中为存储的属性设置初始值,或者通过将默认属性值分配为属性定义的一部分来设置初始值。 以下各节介绍了这些操作。

您有两种选择:

1)

var username : String = ""
var firstName : String = ""
var lastName : String = ""

2)

var username : String?
var firstName : String?
var lastName : String?

这里发生了几件事。

首先, 将自定义初始化程序添加到Object子类时 ,必须将它们声明为便捷初始化程序。 无法从子类中正确实现Object所需的初始化程序,而使用便捷的初始化程序则无需尝试执行此操作。 这也意味着您将改为从自定义初始化程序中委托给self.init()而不是super.init()

其次,存储的属性必须具有初始值。 没有初始值,Swift编译器将不会为您的类合成初始化程序(在这种情况下,是调用基类的init()版本)。

最后,正如我在其他地方提到的那样,必须使用Swift的dynamic修饰符声明String类型的属性,以允许Realm截取它们的get / set操作。

遵循这些准则,您将得到如下结果:

public class Card : Object {
    dynamic var username: String = ""
    dynamic var firstName: String = ""
    dynamic var lastName: String = ""

    convenience init?(dictionary: [String:Any]?) {
        guard let dictionary = dictionary,
            let username = dictionary["username"] as? String,
            let firstName = dictionary["firstName"] as? String,
            let lastName = dictionary["lastName"] as? String
            else { return nil }

        self.init()

        self.username = username
        self.firstName = firstName
        self.lastName = lastName
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM