2015-06-24 90 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

啊哈!所以在第二個理由中,因爲它會被嵌套在擴展中,所以Swift不會看到它,因此會拋出一個Circle或Polygon不符合equatable的錯誤? – rb612

2

否。操作員功能始終在全局空間中,不在類或擴展中。

+0

明白了 - 我從來沒有定義過運算符函數,所以我不確定。謝謝! – rb612