我正在学习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。看看在哪里应用过载?
答案 0 :(得分:3)
我不确定原因,但所有运营商声明都是在全球范围内完成的。而且你是对的 - Swift编译器会查看类型(或者通常在大多数情况下是通用约束),并使用它们来确定要调用的函数。有大量==
定义 - 您可以see them all here。
答案 1 :(得分:3)
这是因为所有运算符都在全局范围内(如果您想定义自己的运算符,则需要declare it first;另请参阅the NSHipster article on operators)。运算符是特殊的,因为它具有优先级和关联,这是普通方法所没有的。
现在,您可以将它们作为Ruby选择实现的对象的一部分,并在某处使用隐式规则。 Swift设计者选择使(自定义)运算符可以重载的全局函数。我不知道他们的原因,但我想这会让编译器变得更容易和更加一致(毕竟,Ruby是解释而Swift是编译的并希望这样做尽可能多地优化编译时间。)