Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fatal Error: use of unimplemented initializer 'init(realm:schema:)'

Tags:

ios

swift

realm

My Issue:

  • Yesterday, I updated my Realm framework from 0.91.5 to 0.92.0 for my project (written in Swift). I found that the Realm Team had already separated Swift part and Objective-C part from the previous entire Cocoa Framework, the team also change the syntax. And I already corrected my code as the latest Realm syntax, but I still got some trouble with init().

The Error:

  • The Compiler thrown the error: fatal error: use of unimplemented initializer init(realm:schema:) for CardModel.
  • The thing is this error did not occur with the previous version of Realm.
  • I used MultiPeer Connectivity framework for project, which means I need to Encode and Decode for exchanging of data.
  • I tried to change or add other init() to CardModel, but it did not work.

My Code:

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")
  }  
}


Please teach me how to solve this problem.

A big appreciation for your guide and time.

Ethan Joe

like image 594
Yichen Zhou Avatar asked May 07 '15 01:05

Yichen Zhou


2 Answers

I ran in the same problem the other day:

Basically you should not create "init" methods but you can create "convenience init" methods. In that case you can't call super.init() but you call something like self.init()

so in your case above you have to remove override init() and the other init can be:

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
}

More information: https://github.com/realm/realm-cocoa/issues/1849

like image 176
mvo Avatar answered Oct 27 '22 04:10

mvo


You need to implement the init like that:

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

There are various posts on github about that.

like image 40
Christian Avatar answered Oct 27 '22 06:10

Christian