为什么在Swift的全局范围内重载==?

时间:2014-10-29 14:21:41

标签: swift

我正在学习Swift,我对为什么在全球范围内完成重载感到有些困惑。这段代码:

class Foo: Equatable {
    var name = "Untitled"
}
func == (lhs: Foo, rhs: Foo) -> Bool {
    return lhs.name == rhs.name
}

let value1 = Foo()
var value2 = Foo()
let firstCheck = value1 == value2

感觉非常奇怪来自Ruby背景,我们在比较的对象上声明了==方法:

class Foo
  def == (otherFoo)
   self.name == otherFoo.name
  end
end

如果我在同一个文件中声明了几个类会怎么样?或者快速查看lhs的类型。和rhs。看看在哪里应用过载?

2 个答案:

答案 0 :(得分:3)

我不确定原因,但所有运营商声明都是在全球范围内完成的。而且你是对的 - Swift编译器会查看类型(或者通常在大多数情况下是通用约束),并使用它们来确定要调用的函数。有大量==定义 - 您可以see them all here

答案 1 :(得分:3)

这是因为所有运算符都在全局范围内(如果您想定义自己的运算符,则需要declare it first;另请参阅the NSHipster article on operators)。运算符是特殊的,因为它具有优先级关联,这是普通方法所没有的。

现在,您可以将它们作为Ruby选择实现的对象的一部分,并在某处使用隐式规则。 Swift设计者选择使(自定义)运算符可以重载的全局函数。我不知道他们的原因,但我想这会让编译器变得更容易和更加一致(毕竟,Ruby是解释而Swift是编译的并希望这样做尽可能多地优化编译时间。)