我是Swift的新手并且一直在搞乱一些代码。我已经定义了一个类似于面向协议编程的WWDC谈话的Layout类。它看起来像这样:
protocol Layout {
associatedtype Content: AnyObject
var contents: [Content] { get }
func layout()
}
基本上,我喜欢一种协议布局,它知道如何布局某些类型的内容(NSView,UIViews等)。
我想像这样扩展这个协议:
protocol StackableLayout : Layout {
var children: [Layout] { get set }
}
StackableLayout是一种布局,可以处理布局类型的数组。但是,由于Layout上的关联类型,因此无法编译。
编译:
protocol StackableLayout : Layout {
associatedtype Child: Layout
var children: [Child] { get set }
}
但强制说我堆叠的所有内容都属于同一类型:
struct YStackLayout<Child: Layout> : StackableLayout {
var children: [Child]
所以我无法获得任意布局项的YStackLayout。我怎么能做到这一点?
我看到这些看似相似的帖子,但我无法弄清楚如何应用它们: How to define a protocol with an array of a protocol with an associated type How do I add different types conforming to a protocol with an associated type to a collection?
编辑:似乎我在这里需要类型擦除。一个链接的例子:
struct AnyAnimal<Food>: Animal {
private let _feed: (Food) -> Void
init<Base: Animal where Food == Base.Food>(_ base: Base) {
_feed = base.feed
}
func feed(food: Food) { _feed(food) }
}