在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>
?
答案 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)