LoginSignup
12

More than 5 years have passed since last update.

RealmのObjectを継承したモデルにイニシャライザを追加する

Last updated at Posted at 2016-11-28

TL;DR

convenience initializerを使う

まずサポートされてない

とても単純ですが

RealmのObjectはObject.init()のoverrideはサポートされていません。
参考:Support overriding Object.init() #1849

実際、

import RealmSwift

class Dog: Object {
    var name: String!
    init(name: String) {

    }
}

みたいなことをすると、designated initializerもかけ〜、みたいに怒られて、どんどん追加して、結局エラーみたいなことになります。

・・・
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
required init(value: Any, schema: RLMSchema) {
    fatalError("init(value:schema:) has not been implemented")
}
・・・

ので、そういうときは、convenience initializerを使います。

サンプル

import RealmSwift

class Dog: Object {
    var name: String!
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

overrideのときと違って、 親クラスのではなく、自分のイニシャライザを呼びます。

こちらの記事が詳しいです:[Swift] クラスのイニシャライザ3: Designated Initializer と Convenience Initializer

とはいえ

自分はいつも基本的にRealmに書き込むと思うので、

class func create(name: String) throws -> Dog {
    let realm = try Realm()
    let d = Dog()
    d.name = name
    try realm.write {
        realm.add(d)
    }
    return d
}

みたいにすることのほうが多いです。参考まで。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12