我一直在玩不同类型的泛型类数组。用一些示例代码最容易解释我的问题:
// 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
?或者还有什么我忽略的?