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
修饰符来声明String
types的属性,以允许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?