tom*_*dey 6 generics macos ios swift
我想要一个接受序列的函数Int.这是我想写的:
func process(items: Sequence<Int>) {
items.forEach { ... }
}
Run Code Online (Sandbox Code Playgroud)
错误:"无法专门化非泛型类型'序列'".
更正(我认为):
func process<S: Sequence>(items: S) where S.Iterator.Element == Int {
items.forEach { ... }
}
Run Code Online (Sandbox Code Playgroud)
相当多一些冗长.
我知道序列协议具有相关联的类型的Iterator,其具有Element.但我不太清楚为什么我必须以Int这种奇怪的方式解决这个问题.
使第一个版本不起作用但第二个版本不起作用的基本概念是什么?错误是什么意思?
您的问题与泛型类型和关联类型之间的区别有关。请参阅此处(标题为“通用类型”、“关联类型”的部分),了解它们在 Swift 中的用途的基本说明。协议(如序列)使用关联类型,而不是泛型类型。Sequence如果您的第一个代码示例是具有泛型类型的具体类,那么它是有意义的- 这种差异应该解释错误消息。
至于为什么协议使用关联类型而不是泛型类型,请参阅此问题的最佳答案。从本质上讲,尽管它们似乎具有相同的目的,但关联类型意味着更加灵活和更具描述性,而泛型类型则与实现有关。这会使您的代码示例更加冗长,但总体而言,使许多代码示例更加简单。
其实从Sequence源码来看,Sequence有一个关联类型Iterator,它符合IteratorProtocol协议,而Iterator又拥有自己的关联类型Element(可以是任意类型)。