无法将类型“ XXX.Protocol”的值转换为预期的参数类型“ XXX.Type”

时间:2019-06-04 08:29:30

标签: swift

我有一个将其数据保存在数据库中的应用程序,而当我在Swift中完全重写它时,我面临以下问题。 基本上,我有一个根类DatabaseObject,数据库中的所有对象都继承自该类。然后在某个时候,我想声明一些数据库对象将采用的协议。最后,我希望能够在泛型函数中使用该协议,但无法编译。

这是您可以在操场上运行的简化代码:

class DatabaseObject {
    var id: String

    init(id: String) {
        self.id = id
    }
}

protocol SomeProtocol: DatabaseObject {
    func someFunc()
}

func getObject<T: DatabaseObject>(id: String, type: T.Type) -> T? {
    // Fetch the object and returns it
    // [...]
    return nil
}

let object1 = getObject(id: "XXX", type: DatabaseObject.self)
let object2 = getObject(id: "XXX", type: SomeProtocol.self)

最后一行生成错误“无法将类型'SomeProtocol.Protocol'的值转换为预期的参数类型'DatabaseObject.Type'“

SomeProtocol继承自DatabaseObject,所以我希望这段代码可以正常工作。

作为一种解决方法,我可以做到:

let workaround = getObject(id: "XXX", type: DatabaseObject.self) as? SomeProtocol

但是我不喜欢它,因为它破坏了创建通用函数的目的……

这是Swift的限制吗?有谁有更好的主意吗?

0 个答案:

没有答案