【问题标题】:No exact matches in call to intializer调用初始化程序没有完全匹配
【发布时间】:2020-10-28 19:50:35
【问题描述】:

我最近转移到 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 初始化程序?
  • @Sulthan,不。请检查更新的问题。我还为基本模型添加了图像。
  • 请始终添加代码,而不是图像。图像非常适合提供附加信息,但前提是您还将代码添加为文本。显然,您不能使用Self() 创建实例,因为ModelMappeableBaseModel 都不包含required init()
  • @Sulthan,那么解决方案是什么?

标签: ios swift iphone realm


【解决方案1】:

您可以为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)
    }
}

【讨论】:

  • 它说“覆盖”是在覆盖所需的初始化程序时隐含的”
  • @VinodSingh 我没有看到任何错误。您使用的是哪个版本的 Xcode?​​span>
  • 这是 Xcode 12.0.1。在 Xcode 11 中没有遇到任何问题。只有 12 个有这些问题
  • @VinodSingh 这很奇怪。我在 Xcode 12.0.1 中测试了这段代码。那么,这是编译错误吗?
  • 也许删除override 会解决它?
猜你喜欢
  • 2021-03-14
  • 2022-11-19
  • 2022-08-02
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2020-08-22
  • 2020-10-29
  • 2021-09-19
相关资源
最近更新 更多