如何扩展协议可选,其中包装的项目是等价通用元素数组?

时间:2019-01-11 09:35:09

标签: swift protocols

我会说这个问题与扩展名的正确声明有关。

我想扩展用通用Element填充的Array,其中Element符合Equatable。我设法做到了:

    extension Array where Element: Equatable{
        // my code
    }

但是,当充满Equatable元素的数组位于Optional内部时,我想知道如何正确声明扩展名?我知道在这种情况下,我实际上是扩展了Optional协议,但我想不通其余的

我在想类似的东西:

    extension Optional where Wrapped: Array  & Equatable {
      // my code
    }

无法弄清楚。 有任何想法吗 ?

2 个答案:

答案 0 :(得分:4)

Cristik提供了一个很好的解决方案。一种替代方法是为可等同元素的可选 collection 编写扩展:

extension Optional where Wrapped: Collection, Wrapped.Element: Equatable {
    func foo() { }
}

这将适用于数组,数组切片和其他集合。

根据扩展名的作用,您可能需要使用CollectionMutableCollectionBidirectionalCollectionRandomAccessCollection的组合。

答案 1 :(得分:3)

我认为您不能在扩展级别上指定此约束,但是您应该能够在功能级别上指定它:

extension Optional {
    func myFunc<T: Equatable>() where Wrapped == [T] {
        // do your thing
    }
}