我一直在尝试使用不同类型的通用类数组。通过以下示例代码最易于解释我的问题:
// Obviously a very pointless protocol...
protocol MyProtocol {
var value: Self { get }
}
extension Int : MyProtocol { var value: Int { return self } }
extension Double: MyProtocol { var value: Double { return self } }
class Container<T: MyProtocol> {
var values: [T]
init(_ values: T...) {
self.values = values
}
func myMethod() -> [T] {
return values
}
}
现在,如果我试图创建一个类似下面的容器数组:
var containers: [Container<MyProtocol>] = []
我遇到了以下错误:
协议'MyProtocol'只能用作泛型约束,因为它具有Self或关联类型的要求。
要解决这个问题,我可以使用[AnyObject]
:
let containers: [AnyObject] = [Container<Int>(1, 2, 3), Container<Double>(1.0, 2.0, 3.0)]
// Explicitly stating the types just for clarity.
但是当枚举
containers
时,现在又出现了另一个“问题”:for container in containers {
if let c = container as? Container<Int> {
println(c.myMethod())
} else if let c = container as? Container<Double> {
println(c.myMethod())
}
}
如上所示的代码,确定了
container
的类型后,在两种情况下都调用了相同的方法。我的问题是:是否有更好的方法来获取具有正确类型的
Container
,而不是将其强制转换为每种可能的Container
类型?或者我是否忽略了其他什么东西?