Коллекция ‹типа реализации протокола› в Swift

Рассмотрим эту (упрощенную) программу. У меня есть протокол 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.


person dgund    schedule 25.08.2016    source источник
comment
См. также сообщение в блоге Роба Нэпьера о ластиках шрифтов.   -  person jscs    schedule 25.08.2016
comment
Приведенный выше пост в блоге действительно помог мне. Решение заключалось в использовании шрифтовых ластиков.   -  person dgund    schedule 26.08.2016
comment
Хотя более серьезная проблема, с которой я столкнулся, рассматривается в an-associated-type-to" title="как добавить различные типы, соответствующие протоколу, с ассоциированным типом в">stackoverflow.com/questions/31762045/ ...   -  person dgund    schedule 26.08.2016