2014-10-29 31 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