我发现了一个迅速扩展的问题:
protocol Racer {
var speed: Double { get }
}
extension Sequence where Iterator.Element == Racer {
func fastest() -> Iterator.Element? {
return self.max(by: { (a: Iterator.Element, b: Iterator.Element) -> Bool in
return a.speed < b.speed
})
}
}
extension Sequence where Iterator.Element: Racer {
func bla() -> Void {
}
}
我想知道他们之间有什么不同。实际上,
[Racer]
类型的数组没有bla()
函数。编辑1:我现在明白了。但仍然是一个问题,假设我们有一个结构符合
Racer
struct Human: Racer {
var speed: Double
}
如果我们有一个
Array<Racer>
:let me = Human(speed: 99999)
let you = Human(speed: 99998)
let arr: [Racer] = [me, you]
// it's no problem we can do this
arr.fastest()
// but
let arr2: [Human] = [me, you]
// this Array won't have the `fastest` function
arr2.fastest() ------> Error!
所以,为了同样的功能,我必须同时扩展
==
和:
? 最佳答案
使用:
时,您正在为符合特定协议或继承指定类的类型编写扩展。
使用=
时,您正在为特定类型编写扩展,在您的情况下是Racer
。
您可以在here文档中阅读更多内容。
编辑:
一个区别是,当使用=
时,类型必须匹配,这意味着数组的元素类型必须Racer
。
这就是为什么Array[Human]
没有得到扩展方法,因为类型不是Racer
实际上是Human
。
您不需要两种方法,您可以将第一种方法更改为使用:
而不是=
。符合Racer
协议就足够了,不需要是Racer
类型。