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

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调用之前使用'self'

我有我的class正常工作。 添加RealmSwift后,我得到这些错误。 如果我添加super.init()它抱怨:

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

这里有几件事情正在进行。

首先,在将自定义初始化程序添加到Object子类时 ,必须将其声明为便捷初始值设定项。 从子类中正确实现Object的必需初始化器是不可能的,而使用便捷初始化器则不需要尝试这样做。 这也意味着你将代替自定义初始值设定项中的self.init()而不是super.init()

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

最后,正如我在别处提到的那样,必须使用Swift的dynamic修饰符来声明Stringtypes的属性,以允许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 } } 

因为你的属性是string。

从苹果文件 …

设置存储属性的初始值

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

你有两个select:

1)

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

2)

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