为什么不能将协议用作 swift 中通用类型的类型?
Why can't a protocol not be used as a type for a generic type in swift?
谁能解释一下为什么这在飞机上是不可能的swift:
protocol ProtocolA {
func a()
}
class B<T: ProtocolA> {
}
class ClassC {
func c(value: B<ProtocolA>) {
}
}
这会产生以下错误:error: protocol type 'ProtocolA' does not conform to protocol 'ProtocolA' because 'ProtocolA' is not declared @objc
。我可以通过将协议声明为 @objc 来解决此问题,但我想了解原因,因为对我来说这看起来像是泛型的一个非常重要的用例。
这似乎是 Swift 2 中的错误,因为它适用于 Swift 1.2
作为解决方法,您可以改用通用函数:
class ClassC {
func c<T: ProtocolA>(value: B<T>) {
}
}
编辑
从 Xcode 7 beta 6 开始,您会收到一条错误消息:
using 'ProtocolA' as a concrete type conforming to protocol
'ProtocolA' is not supported
所以这应该被认为是正常行为。
谁能解释一下为什么这在飞机上是不可能的swift:
protocol ProtocolA {
func a()
}
class B<T: ProtocolA> {
}
class ClassC {
func c(value: B<ProtocolA>) {
}
}
这会产生以下错误:error: protocol type 'ProtocolA' does not conform to protocol 'ProtocolA' because 'ProtocolA' is not declared @objc
。我可以通过将协议声明为 @objc 来解决此问题,但我想了解原因,因为对我来说这看起来像是泛型的一个非常重要的用例。
这似乎是 Swift 2 中的错误,因为它适用于 Swift 1.2
作为解决方法,您可以改用通用函数:
class ClassC {
func c<T: ProtocolA>(value: B<T>) {
}
}
编辑
从 Xcode 7 beta 6 开始,您会收到一条错误消息:
using 'ProtocolA' as a concrete type conforming to protocol 'ProtocolA' is not supported
所以这应该被认为是正常行为。