Swift + Realm новичок: проблемы с простым объектом Realm и его инициализаторами

Я долгое время был разработчиком Objective-C и слышал о Realm несколько недель назад. С другой стороны, я всегда хотел постепенно мигрировать в Swift, поэтому я создал небольшой проект с участием Realm + Swift.

что это значит? Я новичок Swift + Realm.

в любом случае, я создал небольшую демонстрацию/доказательство концепции для проекта, который я имею в виду, и я думал, что это должно быть проще. Но компилятор Xcode говорит иначе.

моя проблема с одним из моих Инициализатор(ы) объектов.

мои намерения были простыми, но, по-видимому, Realm нуждается в большем количестве инициализаторов, чем я хотел.

код одного из объектов моей области таков:

import Foundation

import Realm
import RealmSwift

class Partida: Object
{
    dynamic var id_partida: String
    dynamic var inventario: Inventory?

    required init ()
    {
        inventario = Inventory()
        id_partida = "id_partida_test"
        super.init()
    }



    required init(value: AnyObject, schema: RLMSchema) {
        //fatalError("init(value:schema:) has not been implemented")
        super.init(value: value, schema: schema)
    }


    required init(realm: RLMRealm, schema: RLMObjectSchema) {
        //fatalError("init(realm:schema:) has not been implemented")
        super.init(realm: realm, schema: schema)
    }

    override class func primaryKey() -> String? {
        return "id_partida"
    }

}

мой исходный код имел только" нормальный " инициализатор инициализации. Но Xcode заставил меня создать еще два дополнительных инициализатора (value и realm).

Если я компилирую код, который я только что вставил выше, Xcode жалуется на 2-й и 3-й необходимые инициализаторы, в частности в сверхприбыль.инит часть. Он говорит:

Property 'self.id_partida' not initialized at super.init call

Я понимаю смысл этого, но я не знаю, как избежать ошибки, потому что если я удалю оба супер.строки init, программа аварийно завершает работу во время выполнения.

Если я раскомментирую строки fatalError, они также аварийно завершают работу во время выполнения.

На самом деле я не хочу использовать эти 2 инициализаторы. Если бы я мог, я бы не добавил их, но Xcode должен, по-видимому. Единственный код, который я действительно хочу добавить к моей функции init объекта, - это " простой" функция init, которая была единственной частью кода, считавшейся моей.

Я думаю, что у меня могут быть некоторые концептуальные недоразумения в Realm + Swift + инициализаторы.

Я также чувствую, что Xcode заставляет меня добавлять код, который мне не нужен, и / или я тоже не понимаю.

любая помощь по пониманию инициализаторов "required init" в Realm будет более чем приветствоваться.

официальная документация Realm + Swift выходит за рамки моих знаний, поскольку я не понимаю многие из его концепций даже после многократного перечитывания.

Google и StackOverflow на этот раз не были действительно полезны...

спасибо.

2 ответов


инициализаторы в Swift определенно ведут себя немного иначе, чем Objective-C, поэтому я определенно вижу угол, под которым вы идете отсюда.

в этом случае, хотя, поскольку вы просто используете инициализатор для установки некоторых значений по умолчанию, это совершенно необязательно, так как вы должны иметь возможность назначить значения по умолчанию самим свойствам:

class Partida: Object
{
    dynamic var id_partida = "id_partida_test"
    dynamic var inventario: Inventory? = Inventory()

    override class func primaryKey() -> String? {
        return "id_partida"
    }

}

Дайте мне знать, если это все еще не работает! :)


потому что у него уже есть init () на Object класс, вы используете подкласс Object, так что у вас уже есть свой!--3--> в объекте Realm вы должны дать значение var init, например dynamic var id_partida: String = "id_partida_test", а затем, если вы позвоните let test = Partida() он уже имеет значение 2 init, другой init должен быть отмечен с удобством

когда вы сохраняете объект в постоянное хранилище, он должен всегда иметь значение, вы можете использовать необязательный Realm, тогда нужно прочитать документацию

вот мой образец Класс Realm, чтобы у вас возникла идея:

import Foundation
import RealmSwift
import SwiftyJSON

class ProjectModel: Object {
    dynamic var id: Int = 0
    dynamic var name: String = ""

    //Dont need this, call init() already have value
    required init() {
       id = 0
       name = ""
       super.init()
    }

    convenience init(fromJson json: JSON!){
        self.init()

        if json == nil {
            return
        }

        id = json["id"].intValue
        name = json["name"].stringValue
    }

    override class func primaryKey() -> String? {
        return "id"
    }
}