Нет точных совпадений при вызове инициализатора

#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 исправит это?