2014-10-29 32 views
1

我正在学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。看看在哪里应用超载?

+0

Swift示例改编自https://developer.apple.com/library/mac/documentation/General/Reference/SwiftStandardLibraryReference/Equatable.html – max 2014-10-29 14:23:18

+0

我很清楚,操作符是在全局范围内定义的,因为不是所有的操作符将在逻辑上属于一个操作数的类型,而不是另一个。在这些情况下,您可以将操作员定义在单独的文件中,以强调缺乏所有权。 – Jessy 2014-10-29 16:11:55

+0

@Jessy你说的是做苹果梨比较哪里的lhs和rhs是不同的类型,或者当重载操作符的类型可能不属于你? – max 2014-10-29 16:27:08

回答

3

这是因为所有运营商都在全球范围内(如果您想自己定义您需要declare it first;另请参阅the NSHipster article on operators)。操作人员是特殊的,因为它有一个优先协会,一些普通方法不具备的。

现在你可以让它们的对象的一部分,像Ruby选择实施,与地方潜规则。 Swift设计人员选择使(自定义)运算符可以超载的全局函数。我不知道他们的理由,但我想它使事情变得更加容易和编译器更一致的(毕竟,Ruby是解释而雨燕是编译和想要做的编译时间尽可能多的优化)。

3

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

+0

令人敬畏的工具和答案,@DarkDust确实提供了更多的细节。 – max 2014-10-29 14:43:18