我有一个将其数据保存在数据库中的应用程序,而当我在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的限制吗?有谁有更好的主意吗?