RealmSwift初始化程序:在super.init调用之前自己使用

时间:2017-06-22 22:33:39

标签: ios swift realm

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(),则会抱怨:

  

属性' self.username'没有在super.init调用

初始化

2 个答案:

答案 0 :(得分:2)

因为您的属性是String。

来自apple docs ...

设置存储属性的初始值

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

您有两种选择:

1)

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

2)

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

答案 1 :(得分:1)

这里有几件事情。

首先,当adding custom initializers to subclasses of Object时,必须将它们声明为便利初始化器。从子类中正确实现"terminal.integrated.cwd": ""所需的初始化程序是不可能的,并且使用便利初始化程序无需尝试执行此操作。这也意味着您将从自定义初始化程序中委派Object而不是self.init()

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

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

按照这些指导原则,您最终会得到类似的结果:

dynamic