= =和之间的区别在于swift扩展条件

时间:2017-03-29 07:46:34

标签: 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 {

    }
}

我想知道它们之间有什么区别。实际上,[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!

那么,我必须同时为同一个函数扩展==:吗?

1 个答案:

答案 0 :(得分:3)

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

使用=时,您正在撰写特定类型的扩展程序,例如Racer

您可以在文档here中阅读更多内容。

编辑:

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

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