符合协议的Swift泛型类型不能用于引用协议吗?

时间:2014-08-20 00:45:41

标签: generics swift protocols

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>
{

}

我认为可以使用符合协议的泛型类型来调用引用相同协议的方法。怎么施展呢?几乎尝试了一切,没有任何工作。也许我理解错了......

对这一个人有任何帮助吗?非常感谢

1 个答案:

答案 0 :(得分:11)

试试这个

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> = {}

正如我在this answer中所指出的那样,Data<T>与<{1}}的没有关系。因此,您无法使用期望Data<Identifiable>的{​​{1}},从而导致编译错误。