== 和 : 在 swift 扩展 where 条件中有什么区别

Kle*_*oke 2 swift swift-extensions

我在 swift 扩展中有一个问题:

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 {

    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道它们之间有什么区别。实际上,类型的数组[Racer]没有bla()功能。


编辑1?还有一个问题,假设我们有一个结构体符合Racer

struct Human: Racer {
    var speed: Double
}
Run Code Online (Sandbox Code Playgroud)

如果我们有一个Array<Racer>

let me = Human(speed: 99999)
let you = Human(speed: 99998)
let arr: [Racer] = [me, you]
// Threre'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!
Run Code Online (Sandbox Code Playgroud)

所以,我不得不延长两==:在同一时间对同一功能?

Rad*_*iță 5

使用时,:您正在为符合特定协议或继承指定类的类型编写扩展。

使用时,=您正在为特定类型编写扩展,在您的情况下Racer.

您可以在此处的文档中阅读更多内容。

编辑:

一个区别是,当您使用=类型 must match 时,这意味着数组的元素类型必须Racer. 这就是为什么Array[Human]没有得到扩展方法的原因,因为类型不是Racer实际上是Human.

您不需要 2 种方法,您可以更改第一个使用:而不是 =. 符合Racer协议就足够了,它不需要是Racer类型的。