【问题标题】:Function that accepts sequence of type接受类型序列的函数
【发布时间】:2016-09-26 14:54:58
【问题描述】:

我想要一个接受Int 序列的函数。这是我想写的:

func process(items: Sequence<Int>) {
   items.forEach { ... }
}

错误:“无法专门化非泛型类型‘序列’”。

更正(我认为):

func process<S: Sequence>(items: S) where S.Iterator.Element == Int {
    items.forEach { ... }
}

有点冗长。

我知道序列协议有一个关联类型为Iterator,它有Element。但我不太清楚为什么我必须以这种奇怪的方式解决Int 的要求。

使第一个版本不起作用但第二个版本起作用的基本概念是什么?错误是什么意思?

【问题讨论】:

  • func process(items: Int) -> Sequence{ }

标签: ios swift macos generics


【解决方案1】:

您的问题与泛型类型关联类型之间的区别有关。有关它们在 Swift 中用途的基本解释,请参阅 here(标题为“通用类型”、“关联类型”的部分)。协议,如序列,使用关联类型,而不是泛型类型。如果Sequence 是具有泛型类型的具体类,那么您的第一个代码示例将是有意义的——这种差异应该可以解释错误消息。

关于为什么协议使用关联类型而不是泛型类型,请参阅this question 的顶级答案。本质上,尽管它们似乎服务于相同的目的,但关联类型意味着更灵活和更具描述性,而泛型类型是关于实现的。这使您的代码示例更加冗长,但总体而言,使许多代码示例更简单。

其实从Sequence source codeSequence有一个关联类型Iterator,它符合IteratorProtocol协议,而后者又拥有自己的关联类型Element(可以是任何类型)。

【讨论】:

    【解决方案2】:

    你为什么不使用Int的数组?

    func process(items: [Int]) {
       items.forEach { ... }
    }
    

    【讨论】:

    • 我想接受Int的任何序列。我想了解我提出的问题。
    • Int 的任何序列是什么意思?
    【解决方案3】:

    你可以使用Variadic Parameters

    func process(items: Int...) {
        items.forEach { (item) in
            //do stuff with your 'item'
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多