【发布时间】:2015-04-22 11:50:24
【问题描述】:
我一直在玩不同类型的泛型类数组。用一些示例代码最容易解释我的问题:
// 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>] = []
我得到错误:
Protocol '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 的所有可能类型?或者还有什么我忽略的?
【问题讨论】:
-
这里不适合使用“链接列表”吗?类 ContainerNode
{ var head: ContainerNode var next: ContainerNode ? }
标签: arrays swift generics swift-protocols