在 Swift 的扩展中,== 和 : 有什么区别?

4

我有一个关于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 {

    }
}

我想知道它们之间的区别。事实上,类型为[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]
// 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!

所以,我必须同时为相同的函数扩展==:吗?

1个回答

7

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

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

您可以在此处阅读更多文档

编辑:

一个区别在于,当您使用=时,类型必须匹配,这意味着数组的元素类型必须Racer。 这就是为什么Array [Human]不会获得扩展方法的原因,因为类型不是Racer,实际上是Human

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


谢谢提供文档,我明白了。请看我的编辑,还有另一个相关问题。 - Klein Mioke
关于编辑,我在游乐场中尝试了一下,[Racer] 不会有 bla() 函数。例如,如果我不使用 = 扩展它,[Human(),Dog()] .bla() 将无法正常工作。 - Klein Mioke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接