2015-06-24 2 views
2

Когда я смотрел 2 WWDC 2015 лекции, они отметили следующий код:Функции, определенные после расширения протокола?

func == (lhs: Polygon, rhs: Polygon) -> Bool { 
    return lhs.corners == rhs.corners 
} 
extension Polygon : Equatable {} 
func == (lhs: Circle, rhs: Circle) -> Bool { 
    return lhs.center == rhs.center 
    && lhs.radius == rhs.radius 
} 
extension Circle : Equatable {} 

не Должен equatable объявления функций идет внутри расширений? Прямо сейчас, они снаружи и существуют где? Другими словами, разве это не должно выглядеть так?

extension Polygon : Equatable { 
    func == (lhs: Polygon, rhs: Polygon) -> Bool { 
     return lhs.corners == rhs.corners 
    } 
} 

extension Circle : Equatable { 
    func == (lhs: Circle, rhs: Circle) -> Bool { 
     return lhs.center == rhs.center 
     && lhs.radius == rhs.radius 
    } 
} 

ответ

2

Две проблемы, когда вы пытаетесь второй вариант:

  1. Операторы позволяют только в глобальном масштабе
  2. Расширение не отвечает требованиям к Equatable из 1.

В другом слова. Нет, вы не можете сделать это в зависимости от объема декларации оператора.

+0

Aha! Итак, в причине 2, потому что он будет вложен внутри расширения, Swift не увидит его и, следовательно, будет вызывать ошибку, которая не соответствует окружности Circle или Polygon? – rb612

2

Нет. Операторские функции всегда находятся в глобальном пространстве, а не внутри класса или расширения.

+0

Получил это - я никогда раньше не определял функцию оператора, поэтому я не был уверен. Благодаря! – rb612

Смежные вопросы