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