我有一个带有通用参数T class CacheRepository<T> {}
的类,该类包含一个func transform()
。如果func transformCodable<U: Codable>(ofType: U.Type)
符合T
协议,则需要在其中调用具有以下签名Codable
的另一个函数。但是我没有这样做。下面是我的试验及其编译错误。
审判1:
func transform() {
if T.self is Codable.Type {
// Error: In argument type 'CacheRepository<T>.T.Type' (aka 'T.Type'), 'T' does not conform to expected type 'Decodable'
sharedStorage!.transformCodable(ofType: T.self)
}
}
试用2:
func transform() {
if T.self is Codable.Type {
//Cannot invoke 'transformCodable' with an argument list of type '(ofType: (Codable))'
//Expected an argument list of type '(ofType: U.Type)'
sharedStorage!.transformCodable(ofType: (T as! Codable).self)
}
}
试用3:我尝试扩展CacheRepository
类,如果T is Codable
,但是在init()函数中调用扩展transform
函数时,它永远不会被调用。而且,如果我在创建实例后调用了它,那么并不是在所有情况下都调用它。
class CacheRepository<T> {
func transform() {
print("non-codable transform")
}
}
extension CacheRepository where T: Codable {
func transform() {
sharedStorage!.transformCodable(ofType: T.self)
}
}
示例:可行
let transform = CacheRepository<Int>().transform()
但是,如果我在CacheRepository
类中添加了一个共享实例,并在实例化后尝试调用transform
,则不会调用该实例。真的很奇怪,如果我在控制台中的新实例上调用了tranform
,就会调用右边的transform
。
答案 0 :(得分:0)
这怎么样?
extension CacheRepository where T: Codable {
func transform() {
print("Codable")
sharedStorage!.transformCodable(ofType: T.self)
}
}
extension CacheRepository {
func transform() {
print("Non-codable")
}
}
这在非常简化的CacheRepository
中按预期工作。但不确定是否可以在您实际的CacheRepository
中使用,请尝试。