Экспериментируя с дженериками в Swift, я столкнулся с этой проблемой и не смог найти ответ.
Скажите, у меня есть следующий код:
protocol Component {
}
protocol Contains {
associatedtype CompType: Component
var components: [CompType] { get set }
}
Здесь типы, которые реализуют Contains
, должны иметь возможность хранить любой тип, который реализует протокол Component
, определенный их typealias. Если я расширю код до следующего, он будет работать как положено.
protocol Component {
}
struct SomeComponent: Component {
init() {
}
}
struct AnotherComponent: Component {
init() {
}
}
protocol Contains {
associatedtype CompType: Component
var components: [CompType] { get set }
}
struct Container: Contains {
typealias CompType = SomeComponent
var components: [SomeComponent]
}
var x = Container(components: [SomeComponent()]) // works perfectly!
var y = Container(components: [AnotherComponent()]) // fails as expected
Наконец, вопрос: возможно ли заставить Container.components
принимать и SomeComponent
, и AnotherComponent
, но отклонить другие типы, которые реализуют протокол Component
? Другими словами, может ли typealias
содержать более одного типа?
Спасибо!