考虑这个(简化的)程序。我有一个协议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 Playground中,我在public var things: [Thing]
陈述
协议'Thing'只能用作通用约束,因为它具有Self或相关类型要求。
如果协议Thing
没有继承其他协议,则此代码有效,但在我的情况下,我确实希望Thing
的实现是Equatable(并且可能是Hashable)。
我想我可以使ThingCollection
泛型并使用不同的实例来存储单一类型的Thing
,但是我怎样才能在{{1}中存储任意ThingCollection
个实例}}?我可以使用ThingCollectionCollection
只能保留一种ThingCollection
的实例。