接受

时间:2016-09-26 14:54:58

标签: ios swift macos generics

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

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

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

更正(我认为):

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

相当冗长。

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

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

3 个答案:

答案 0 :(得分:1)

您的问题与通用类型关联类型之间的区别有关。有关其在Swift中的用途的基本解释,请参阅here(标题为&#34;通用类型&#34;&#34;关联类型和#34;的部分)。协议(如Sequence)使用关联类型,而不是泛型类型。如果Sequence是具有泛型类型的具体类,那么您的第一个代码示例是有意义的 - 这种差异应该解释错误消息。

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

实际上,从Sequence source code开始,Sequence有一个关联的类型Iterator,它符合IteratorProtocol协议,后者又有自己的关联类型Element(可以是任何类型)。 / p>

答案 1 :(得分:0)

为什么不使用Int数组?

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

答案 2 :(得分:0)

您可以使用Variadic Parameters

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