致命错误:使用未实现的初始化程序'init(realm:schema :)'

12

我的问题:

  • 昨天我将我的项目(用Swift编写)中的Realm框架从0.91.5升级到0.92.0。我发现Realm团队已经将之前的整个Cocoa框架中的Swift部分和Objective-C部分分离出来,并更改了语法。虽然我已经按照最新的Realm语法纠正了我的代码,但我在init()方面仍然遇到一些麻烦。

错误信息:

  • 编译器抛出错误:fatal error: use of unimplemented initializer init(realm:schema:) for CardModel
  • 奇怪的是,这个错误在以前的Realm版本中没有出现过。
  • 我在项目中使用了MultiPeer Connectivity框架,这意味着我需要进行数据交换的EncodeDecode操作。
  • 我尝试更改或添加其他init()以解决CardModel的问题,但没有成功。

我的代码:

import RealmSwift

class CardModel: Object {
dynamic var cardID: String = ""
dynamic var firstName: String = ""
dynamic var lastName: String = ""
dynamic var userImage = NSData()
dynamic var status: String = ""
dynamic var cardType: Int = 1
dynamic var cardDate = NSDate()

override init() {
    super.init()
}

init(coder aDecoder: NSCoder) {
    super.init()
    self.userImage = aDecoder.decodeObjectForKey("userImage") as! NSData
    self.cardID = aDecoder.decodeObjectForKey("cardID") as! String
    self.firstName = aDecoder.decodeObjectForKey("firstName") as! String
    self.lastName = aDecoder.decodeObjectForKey("lastName") as! String
    self.status = aDecoder.decodeObjectForKey("status") as! String
    self.cardType = aDecoder.decodeObjectForKey("cardType") as! Int
    self.cardDate = aDecoder.decodeObjectForKey("cardDate") as! NSDate
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.userImage, forKey: "userImage")
    aCoder.encodeObject(self.cardID, forKey: "cardID")
    aCoder.encodeObject(self.firstName, forKey: "firstName")
    aCoder.encodeObject(self.lastName, forKey: "lastName")
    aCoder.encodeObject(self.status, forKey: "status")
    aCoder.encodeObject(self.cardType, forKey: "cardType")
    aCoder.encodeObject(self.cardDate, forKey: "cardDate")
  }  
}


请教如何解决这个问题。

感谢您的指导和耐心。

Ethan Joe

3个回答

17

我前几天也遇到了同样的问题:

基本上你不应该创建"init"方法,但你可以创建"convenience init"方法。在这种情况下,你不能调用super.init(),而是要调用类似于self.init()的东西。

所以在你上面的情况中,你需要移除override init(),另外一个init可以是:

convenience required init(coder aDecoder: NSCoder) {
    self.init()
    self.userImage = aDecoder.decodeObjectForKey("userImage") as! NSData
    self.cardID = aDecoder.decodeObjectForKey("cardID") as! String
    self.firstName = aDecoder.decodeObjectForKey("firstName") as! String
    self.lastName = aDecoder.decodeObjectForKey("lastName") as! String
    self.status = aDecoder.decodeObjectForKey("status") as! String
    self.cardType = aDecoder.decodeObjectForKey("cardType") as! Int
    self.cardDate = aDecoder.decodeObjectForKey("cardDate") as! NSDate
}

更多信息:https://github.com/realm/realm-cocoa/issues/1849


1
还需要在 convenienceinit( ) 之间添加 required - Yichen Zhou
好的,谢谢您的提醒。我已经更新了我的代码,添加了“required”以帮助未来的读者。 - mvo

3
您需要按照以下方式实现init:

您需要按照以下方式实现init:

init(object:schema:) {   
    super.init(object: object, schema: schema) 
} 

关于这个问题,Github 上有各种帖子


谢谢您的回答,我回家后会进行更正。 - Yichen Zhou
嗨,我在CardModel类中添加了新的init()后仍然遇到一些问题。1. 对于init(object: ?, schema: ?)objectschema应该继承哪些父类?2. 对于super.init(object: object, schema: schema),我猜左边的object不等于右边的,对吗? - Yichen Zhou

1
我最终需要添加:

required convenience init?(_ map: Map) {
    self.init()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接