符合协议的Swift泛型类型无法用于引用协议?

8
import UIKit

protocol Identifiable
{
}

protocol Storage
{
    func test() -> Data<Identifiable>
}

class DiskStorage<T where T:Identifiable, T:NSCoding>:Storage
{
    func test() -> Data<Identifiable>
    {
       return Data<T>() //error: T is not identical to Identifiable
    }
}

class Data<T where T:Identifiable>
{

}

我曾认为可以使用符合协议的通用类型来调用引用该协议的方法。如何进行类型转换?我已经尝试了几乎所有的方式,但没有一种是有效的。也许我理解错了什么......是否有人可以提供帮助?非常感谢!

也许相关:http://stackoverflow.com/a/25014235/642626 - Bryan Chen
@CodaFi 我不理解你的意思。我的观点是 Data<SomeIdentifiableClass>Data<Identifiable> 没有任何关系。 - Bryan Chen
至少来说,你的 T 的语法是次优的。你可以更简单地写成 DiskStorage<T: Identifiable, NSCoding> ... - GoZoner
1个回答

16

试试这个

protocol Identifiable
{}

class Data<T where T:Identifiable>
{}

protocol Storage
{
    typealias Element : Identifiable
    func test() -> Data<Element>
}

class DiskStorage<T where T:Identifiable, T:NSCoding>:Storage
{
    func test() -> Data<T>
    {
       return Data<T>()
    }
}

// from REPL
 32> var s = DiskStorage<Foo>()
s: DiskStorage<Foo> = {}
 33> s.test()
$R0: Data<Foo> = {}

如我在这个答案中所指出的,Data<T>Data<Identifiable>没有任何关系。因此,您不能在期望Data<Identifiable>的地方使用Data<T>,从而导致编译错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接