Рассмотрим эту (упрощенную) программу. У меня есть протокол Thing
, реализованный в двух структурах, ThingOne
и ThingTwo
. У меня есть класс ThingCollection
, в котором я хотел бы хранить произвольные экземпляры структуры, реализующие протокол Thing
, то есть ThingOne()
можно заменить на ThingTwo()
. У меня есть класс ThingCollectionCollection
, в котором я хотел бы хранить произвольные экземпляры ThingCollection
, независимо от содержащихся в нем экземпляров Thing
:
protocol Thing: Equatable {
}
struct ThingOne: Thing {
public static func ==(lhs: ThingOne, rhs: ThingOne) -> Bool {
return true
}
}
struct ThingTwo: Thing {
public static func ==(lhs: ThingTwo, rhs: ThingTwo) -> Bool {
return true
}
}
class ThingCollection {
public var things: [Thing] = [ThingOne()] // Error here
}
class ThingCollectionCollection {
var thingCollections: [ThingCollection] = [ThingCollection()]
}
На игровой площадке Swift я получаю сообщение об ошибке public var things: [Thing]
Протокол «Вещь» может использоваться только в качестве общего ограничения, поскольку он имеет требования к Self или связанному типу.
Этот код работает, если протокол Thing
не наследует другие протоколы, но в моем случае я хочу, чтобы реализации Thing
были Equatable (и, возможно, Hashable).
Я полагаю, что мог бы сделать ThingCollection
универсальным и использовать другой экземпляр для хранения одного типа Thing
, но тогда как я мог хранить произвольные экземпляры ThingCollection
в ThingCollectionCollection
? Меня устраивает, что экземпляр ThingCollection
может содержать только один тип Thing
.