2016-10-01 3 views
1

Я хотел использовать 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?

+0

Я занимался тем же вопросом пару дней назад. Я думаю, они требуют, чтобы у ваших объектов были значения по умолчанию для их свойств, а затем используйте удобные инициализаторы, когда они вам понадобятся. В этом вопросе есть целый поток: https://github.com/realm/realm-cocoa/issues/3185 – kleezy

ответ

2

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

  1. Свойства, которые вы хотите, чтобы сохраняться должны иметь модификатор dynamic к ним применяются, с некоторыми исключениями. См. Примеры property declaration cheatsheet.

  2. Any initializers you add to your Object subclass must be convenience initializers.