如何在Swift中扩展具有关联类型的协议?

时间:2016-08-25 19:20:27

标签: arrays swift generics swift3 swift-protocols

我是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) }
}

0 个答案:

没有答案