我有这样的代码:
protocol MyProtocol {
}
class P1: MyProtocol {
}
class P2: MyProtocol {
}
class C <T: MyProtocol> {
}
然后我需要定义一个变量来委派各种C<MyProtocol>
:
var obj: C <MyProtocol>
但编译错误来了:
不支持使用'MyProtocol'作为符合协议'MyProtocol'的具体类型
我该怎么办?
答案 0 :(得分:1)
此代码:
class C <T: MyProtocol> { }
表示C
是一个通用类,可以专注于符合 T
的任何类型MyProtocol
。
宣布:
var obj: C <MyProtocol>
你(我认为)试图说var obj
将是C
的一个实例,专门用于符合MyProtocol
的某种类型,但你不能在协议类型上专门化泛型类,因为没有协议的直接具体实例。该协议只能存在符合类型的实例。理论上可以有许多符合协议的不同类型。因此,表示法并没有真正告诉编译器使用C
的特定专业化。
这不应该是一个问题,因为你可以编写如下内容:
var obj: C<P1> = C<P1>()
或
var obj = C<P2>() // type is inferred
在您的班级C
中,您仍然可以将T
的任何用途视为符合MyProtocol
。所以我认为这应该可以为您提供所需的一切,只要您记住泛型类的实例必须专用于单个特定的具体类型,而不是可以代表许多可能的具体类型的协议。
答案 1 :(得分:0)
您通常不需要为Swift变量声明类型。在大多数情况下,编译器可以推断类型。此外,对于泛型类,您应该让编译器弄清楚泛型类解析的内容:
class C<T: MyProtocol> {
var value: T
init (value: T) {
self.value = value
}
}
var obj = C(value: P1()) // type: C<P1>
// or:
var obj = C(value: P2()) // type: C<P2>