#ios #swift #iphone #realm
#iOS #swift #iPhone #область
Вопрос:
Недавно я перешел на Xcode 12 и начал получать ошибку, которой нет в Xcode 11. Ошибка связана с расширением, в котором указано, что нет точных совпадений при вызове инициализатора Ниже приведен код —
public typealias UpdateBlock<T> = (_ object: T?) -> Void
protocol ModelMappeable {
func map(_ values: JSON, realm: Realm?)
}
extension ModelMappeable where Self: BaseModel {
static func getOrCreate(realm: Realm, values: JSON?, updates: UpdateBlock<Self>?) -> Self {
var object: Self!
if let primaryKey = values?["_id"].string {
if let newObject = realm.object(ofType: Self.self, forPrimaryKey: primaryKey as AnyObject) {
object = newObject
}
}
if object == nil {
object = self()
}
if let values = values {
object.map(values, realm: realm)
}
updates?(object)
return object
}
}
После удаления переопределения из инициализатора получаем следующие ошибки —
Комментарии:
1. Есть ли
BaseModel
required
инициализатор без параметров?2. @Sulthan, Нет. Пожалуйста, проверьте обновленный вопрос. Я также добавил изображения для базовой модели.
3. Пожалуйста, всегда добавляйте код , а не изображения . Изображения хороши для получения дополнительной информации, но только если вы также добавляете код в виде текста. Очевидно, что вы не можете создать экземпляр, используя
Self()
, потому что ниModelMappeable
один из них илиBaseModel
не содержитrequired init()
.4. @Sulthan, каково решение для этого тогда?
Ответ №1:
Вы можете предоставить required
инициализатор для BaseModel
решения этой проблемы:
class BaseModel: Object {
@objc dynamic var identifier: String?
required override init() {
super.init()
}
}
и изменить:
if object == nil {
object = self()
}
в getOrCreate(realm:values:updates:)
функции, к этому:
if object == nil {
object = Self()
}
Обновление: оказалось, что в предыдущих версиях SwiftRealm это не так просто.
В частности, вам нужно переопределить еще 3 инициализатора, чтобы выполнить то, что вы хотите:
class BaseModel: Object {
@objc dynamic var identifier: String?
required init() {
super.init()
}
override init(value: Any) {
super.init(value: value)
}
required init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
required init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}
}
Комментарии:
1. в нем говорится, что «переопределение» подразумевается при переопределении требуемого инициализатора »
2. @VinodSingh я не вижу никаких ошибок с моей стороны. Какую точную версию Xcode вы используете?
3. Это Xcode 12.0.1. Не возникает никаких проблем в Xcode 11. Только 12 имеет эти проблемы
4. @VinodSingh Это странно. Я протестировал этот код в Xcode 12.0.1. Итак, это ошибка компиляции?
5. Может быть, удаление
override
исправит это?