Массивы Обобщения в Swift
Я играл с массивами общих классов с различными типами. Проще всего объяснить мою проблему с помощью некоторого примера кода:
// 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
? Или я что-то упустил из виду?