2015-02-06 114 views
1

由於蘋果的文件說:Swift:我應該什麼時候使用「var」而不是「let」?

使用let使常量和var,使一個變量。在編譯時不需要知道常量的值,但必須爲其賦值一次。這意味着您可以使用常量來命名一次您確定一次但在許多地方使用的值。

讓我們來看一些類:

class A { 
    var a = [String]() 
} 

由於陣列a是可變的,它通過定義var。但是如果我們考慮B類,那麼A的實例是財產?

class B { 
    let b = A() 
} 

即使b是可變的,let關鍵字都會好起來的,因爲參考不會改變。另一方面,var也可以,因爲b的內容可以更改。我應該在這個例子中選擇什麼 - letvar

+0

你可以隨時使用'var'在那裏你可以使用'let'。 'let'只告訴程序的其餘部分,這個元素不能被重新賦值 – njzk2 2015-02-06 20:28:24

+1

你有沒有看到[swift中'let'和'var'有什麼區別?](http://stackoverflow.com/questions/ 24002092/let-and-var-in-swift之間的區別是什麼)? – 2015-02-06 20:30:47

+2

我通常只是向後彎,讓所有東西都可以。不可變的>可變的,即使在你的第二個例子中並不重要,我放過讓我想起那個。 – 2015-02-06 20:33:43

回答

8

只要你可以使用let。必要時使用var。使事物不可變使得很多錯誤不可能發生,所以它應該是你的默認選擇。儘可能將init中的所有值都設置好,並且永不改變它們。同樣,你可以使用struct,必要時使用class(儘管根據我的經驗,這比使用let更難實現)。

那麼在你的例子中,如果在初始化過程中你不能設置A.a,那麼是的,它應該是var。但在您的示例中,無需使用var代替B.b。 (在任何一個示例中,沒有任何理由使用class,至少在您提出問題的方式中是如此。)

2

讓我們給出這些更好的名稱來幫助我們推理。比方說,

class Head { 
    var hairs = [String]() 
} 

class Person { 
    let head = Head() 
} 

在這個例子中,一個人有且只有一個頭,每個Person的一生中,他/她的頭部將始終是相同的頭部。但是,頭部的頭髮可能會長大,掉出或以其他方式改變。 Person該頭的所有權與Head與頭髮的關係沒有影響。

正如Rob提到的,除非有充分的理由,否則應該始終使用let。當涉及到關於程序行爲的推理時,不變性是你的朋友。

1

使用讓當你的對象沒有改變它的值後設置了一個值。 如果您的對象可以更改其值超過1次,請使用var。

'let'是constance。 'var'是可變的東西。

但是,如果對象是類的實例(值通過引用傳遞),則常量限制僅應用於對象,而不應用於其屬性。根據這些屬性的類型(常量或變量),我們可以在之後更改它們的值。這不適用於結構。

例如:

class VideoMode { 
    var interlaced = false 
    var frameRate = 0.0 
    var name: String? 
} 
在功能

,你聲明

let vm = VideoMode() 
print("starting framerate is \(vm.frameRate)") // -> print starting framerate is 0.0 
vm.frameRate = 20.0 
print("framerate now is \(vm.frameRate)") // -> print framerate now is 20.0 

//we can change .frameRate later to 10.0, there is no compile error 
vm.frameRate = 10.0 
print("framerate now is \(vm.frameRate)") // -> print framerate now is 10.0 
相關問題