我想要一个接受Int
序列的函数。这是我想写的:
func process(items: Sequence<Int>) {
items.forEach { ... }
}
错误:“无法专门化非泛型类型'序列'”。
更正(我认为):
func process<S: Sequence>(items: S) where S.Iterator.Element == Int {
items.forEach { ... }
}
相当冗长。
我知道序列协议的关联类型Iterator
有Element
。但我不太清楚为什么我必须以这种奇怪的方式解决Int
要求。
第一个版本不起作用的第二个概念是什么?错误是什么意思?
答案 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'
}
}