В чем разница между == и : в быстром расширении, где условие

У меня есть вопрос в быстром расширении:

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!

Итак, мне нужно одновременно расширить == и : для одной и той же функции?


person Klein Mioke    schedule 29.03.2017    source источник


Ответы (1)


При использовании : вы пишете расширение для типа, который соответствует определенному протоколу или наследует указанный класс.

При использовании = вы пишете расширение для определенного типа, в вашем случае Racer.

Вы можете прочитать больше в документации здесь.

Редактировать:

Одно отличие состоит в том, что при использовании = тип должен совпадать, это означает, что тип элемента для массива должен быть Racer. Вот почему Array[Human] не получает метод расширения, потому что тип не Racer, а на самом деле Human.

Вам не нужны 2 метода, вы можете изменить первый, чтобы использовать : вместо =. Достаточно соответствия протоколу Racer, он не обязательно должен быть типа Racer.

person Radu Diță    schedule 29.03.2017
comment
Спасибо за эти документы, я понял. Пожалуйста, посмотрите мое редактирование, есть еще один вопрос по этому поводу. - person Klein Mioke; 29.03.2017
comment
Что касается редактирования, я попробовал на игровой площадке, и [Racer] не будет bla() функции. Например, [Human(), Dog()].bla() не будет работать, если я не удлиню его с помощью =. - person Klein Mioke; 30.03.2017