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