为什么我不能以与Swift中泛型类相似的方式声明泛型协议类型?

时间:2017-02-21 20:15:23

标签: swift

在Swift中,这会给我编译错误

class TestType {
}

protocol TestProtocol {
   associatedtypes T: TestType
}

class TestClass<T: TestType> {
   var x: TestProtocol<T>
}

它会给我一个编译器错误,因为TestProtocol“只能用作通用约束”。执行此操作的正确方法更不干净(因为它需要在使用时随处添加TestProtocol的通用参数)

class TestClass<T: TestProtocol> {
   var x: T
}

所以我的问题是,当T已经是一个类型参数时,为什么Swift不能简单地将通用协议称为TestProtocol<T>

1 个答案:

答案 0 :(得分:0)

有一点“黑客”几乎可以得到你想要的东西:你必须在模板参数列表的where子句中指定别名:

class TestType {
    var value:Int = 0
    func doTest() { print ("doing the test \(value)") }
}

protocol TestProtocol {
    associatedtype T: TestType

    func doProtocolForTest (t:T)
}

class TestClass<TT: TestType, TP:TestProtocol> where TP.T == TT {
    var x:TP!
}

// the following demonstrats a sample usage, without much sense
// ------------------------------------------------------------
class TestProtocolImp : TestProtocol {
    func doProtocolForTest(t: TestType) {
        print ("running test...")
        t.doTest()
    }
}

let test = TestType()
test.value = 42

let tc = TestClass<TestType, TestProtocolImp>()
tc.x = TestProtocolImp()
tc.x.doProtocolForTest(t: test)