协议扩展后定义的功能?

Functions defined after protocol extension?

当我在看 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
    }
 }

没有。运算符函数始终在全局 space 中,而不是在 class 或扩展中。

尝试第二个版本时出现的两个问题:

  1. 运算符只允许在全局范围内使用
  2. 扩展不符合 Equatable 因为 1.

换句话说,不,你不能根据运算符声明的范围来做。