如何扩展协议 Optional,其中 Wrapped item 是 Array of Equatable 通用元素?

Pet*_*čík 3 protocols swift

我会说这个问题是关于正确的扩展声明。

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

    extension Array where Element: Equatable{
        // my code
    }
Run Code Online (Sandbox Code Playgroud)

但是我想知道当填充了 Equatable 元素的数组在 Optional 中时如何正确声明扩展?我知道在这种情况下我实际上是在扩展协议 Optional,但我无法弄清楚其余的

我在想这样的事情:

    extension Optional where Wrapped: Array  & Equatable {
      // my code
    }
Run Code Online (Sandbox Code Playgroud)

想不通 有任何想法吗 ?

Cri*_*tik 6

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

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


Mar*_*n R 5

Cristik 提供了一个很好的解决方案。另一种方法是编写一个可选的等价元素集合的扩展:

extension Optional where Wrapped: Collection, Wrapped.Element: Equatable {
    func foo() { }
}
Run Code Online (Sandbox Code Playgroud)

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

根据扩展程序的作用,您可能希望使用Collection, MutableCollection, BidirectionalCollection,的组合RandomAccessCollection