Я хотел использовать RealmSwift, потому что он казался простой в использовании фреймворкой и позволял много работать самостоятельно. Я прочитал documentation, чтобы узнать, как его использовать. И в документации написано, что мне просто нужно импортировать SwiftRealm
и позволить моей модели наследовать от Object
. Так что у меня есть эта простая модель, например:RealmSwift: Как реализовать объект?
import Foundation
import ObjectMapper
func ==(lhs: ADDRESS, rhs: ADDRESS) -> Bool {
return lhs.hashValue == rhs.hashValue;
}
class VADDRESS : Hashable, Mappable {
private var id: Int64!;
private var street: String!;
private var housenumber: String!;
private var addition: String!;
private var postalcode: String!;
private var location: String!;
private var country: String!;
init() {
self.id = -1;
self.street = "";
self.housenumber = "";
self.addition = "";
self.postalcode = "";
self.location = "";
self.country = "";
}
init(id: Int64, street: String, housenumber: String, addition: String, postalcode: String, location: String, country: String) {
self.id = id;
self.street = street;
self.housenumber = housenumber;
self.addition = addition;
self.postalcode = postalcode;
self.location = location;
self.country = country;
}
required init?(map: Map) {
}
func mapping(map: Map) {
self.id <- map["id"];
self.street <- map["street"];
self.housenumber <- map["housenumber"];
self.addition <- map["addition"];
self.postalcode <- map["postalcode"];
self.location <- map["location"];
self.country <- map["country"];
}
var hashValue: Int {
get {
return "\(self.id),\(self.street),\(self.housenumber),\(self.addition),\(self.postalcode),\(self.location),\(self.country)".hashValue;
}
}
}
Если я теперь добавить объект:
import Foundation
import ObjectMapper
func ==(lhs: ADDRESS, rhs: ADDRESS) -> Bool {
return lhs.hashValue == rhs.hashValue;
}
class VADDRESS : Object, Mappable {
private var id: Int64!;
private var street: String!;
private var housenumber: String!;
private var addition: String!;
private var postalcode: String!;
private var location: String!;
private var country: String!;
init() {
self.id = -1;
self.street = "";
self.housenumber = "";
self.addition = "";
self.postalcode = "";
self.location = "";
self.country = "";
}
init(id: Int64, street: String, housenumber: String, addition: String, postalcode: String, location: String, country: String) {
self.id = id;
self.street = street;
self.housenumber = housenumber;
self.addition = addition;
self.postalcode = postalcode;
self.location = location;
self.country = country;
}
required init?(map: Map) {
}
func mapping(map: Map) {
self.id <- map["id"];
self.street <- map["street"];
self.housenumber <- map["housenumber"];
self.addition <- map["addition"];
self.postalcode <- map["postalcode"];
self.location <- map["location"];
self.country <- map["country"];
}
var hashValue: Int {
get {
return "\(self.id),\(self.street),\(self.housenumber),\(self.addition),\(self.postalcode),\(self.location),\(self.country)".hashValue;
}
}
}
я получаю ошибки над ошибками. Итак, сначала мне нужно переопределить метод init()
, потому что Object
, похоже, уже имеет метод init()
. то же самое касается hashValue
. Так что я делаю это:
import Foundation
import ObjectMapper
func ==(lhs: ADDRESS, rhs: ADDRESS) -> Bool {
return lhs.hashValue == rhs.hashValue;
}
class VADDRESS : Object, Mappable {
private var id: Int64!;
private var street: String!;
private var housenumber: String!;
private var addition: String!;
private var postalcode: String!;
private var location: String!;
private var country: String!;
required init() {
super.init();
self.id = -1;
self.street = "";
self.housenumber = "";
self.addition = "";
self.postalcode = "";
self.location = "";
self.country = "";
}
init(id: Int64, street: String, housenumber: String, addition: String, postalcode: String, location: String, country: String) {
self.id = id;
self.street = street;
self.housenumber = housenumber;
self.addition = addition;
self.postalcode = postalcode;
self.location = location;
self.country = country;
}
required init?(map: Map) {
}
// Here is the ERROR appearing!
func mapping(map: Map) {
self.id <- map["id"];
self.street <- map["street"];
self.housenumber <- map["housenumber"];
self.addition <- map["addition"];
self.postalcode <- map["postalcode"];
self.location <- map["location"];
self.country <- map["country"];
}
override var hashValue: Int {
get {
return "\(self.id),\(self.street),\(self.housenumber),\(self.addition),\(self.postalcode),\(self.location),\(self.country)".hashValue;
}
}
}
Но теперь есть ошибка, которую я действительно не понимаю (я не отметил положение в коде как комментарий):
'required' initializer 'init(value:schema') must be provided by subclass of 'Object'
Ok сначала: Ничего, что упоминается в документации. Было написано, что мне нужно было бы только уйти от Object
, и я был бы готов к работе.
Если я теперь добавить этот метод я получить другую ошибку:
'required' initializer 'init(value:schema') must be provided by subclass of 'Object'
Первая ошибка была из-за отсутствующего метода:
required init(realm: RLMREalm, schema: RLMObjectSChema) {
fatalError("init(realm:schema:) has not been implemented")
}
И второй из-за отсутствия:
required init(realm: RLMREalm, schema: RLMObjectSChema) {
fatalError("init(realm:schema:) has not been implemented")
}
Так что я получаю ту же ошибку снова и снова, и он всегда хочет, чтобы я реализовал метод, у.
Что мне на самом деле нужно делать, чтобы использовать RealmSwift?
Я занимался тем же вопросом пару дней назад. Я думаю, они требуют, чтобы у ваших объектов были значения по умолчанию для их свойств, а затем используйте удобные инициализаторы, когда они вам понадобятся. В этом вопросе есть целый поток: https://github.com/realm/realm-cocoa/issues/3185 – kleezy