【问题标题】:How to extend protocol Optional, where Wrapped item is Array of Equatable generic elements?如何扩展协议可选,其中 Wrapped 项目是 Equatable 通用元素数组?
【发布时间】:2026-01-12 04:35:01
【问题描述】:

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

我想扩展用通用元素填充的数组,其中元素符合 Equatable。我已经设法做到了:

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

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

我在想这样的事情:

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

想不通。 有任何想法吗 ?

【问题讨论】:

    标签: swift protocols


    【解决方案1】:

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

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

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

    根据扩展的功能,您可能希望使用CollectionMutableCollectionBidirectionalCollectionRandomAccessCollection 的组合。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这将适用于可选数组,而不是可选数组。还是我误解了这个问题?
      • 用你的想法,那就是extension Optional { func myFunc&lt;T: Equatable&gt;() where Wrapped == [T] { /* ... */ } }
      • @MartinR 你是对的,我误读了Array filled with Equatable elements is inside an Optional 部分。我更新了答案。
      • @MartinR 你是对的。这个怎么样:gist.github.com/eonist/dfa1412dc70eb93b2c516b35dd0daa1c 如果查看了其他一些建议,使用可选数组对数组进行扩展,但这些解决方案通常会增加很多麻烦
      • @eonist:这是对*.com/a/54261472/1187415的回复吗?