【问题标题】:Fatal Error: use of unimplemented initializer 'init(realm:schema:)'致命错误:使用未实现的初始化程序 'init(realm:schema:)'
【发布时间】:2015-05-07 01:51:25
【问题描述】:

我的问题:

  • 昨天,我为我的项目(用 Swift 编写)将我的 Realm 框架从 0.91.5 更新为 0.92.0。我发现Realm团队已经把Swift部分和Objective-C部分从之前的整个Cocoa框架中分离出来了,团队也改变了语法。而且我已经将我的代码更正为最新的 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")
  }  
}


请教我如何解决这个问题。

非常感谢您的指导和时间。

伊桑乔

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

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

    基本上你不应该创建“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

    【讨论】:

    • 而且还需要在convenienceinit( )之间加上required
    • 好的,感谢您的评论,我更新了我的代码以添加required 以帮助未来的读者
    【解决方案2】:

    你需要像这样实现初始化:

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

    github about that上有各种帖子。

    【讨论】:

    • 感谢您的回答,我回家后会更正。
    • 嗨,在我的 CardModel 类中添加新的init( ) 后,我仍然遇到了一些麻烦。 1. 对于init(object: ?, schema: ?), what are Parent Classes 应该objectschema 继承吗? 2.对于super.init(object: object, schema: schema),我猜左边的object不等于右边的吧?
    【解决方案3】:

    我最终需要添加:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2017-03-22
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多