调用初始化程序时没有完全匹配

No exact matches in call to intializer

我最近切换到 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
    }

}

从初始化程序中删除覆盖后出现以下错误 -

您可以为 BaseModel 提供一个 required 初始化器来解决这个问题:

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