Swift 中的 let 和 var 有什麼區別?你應該要小心使用!

如果你是一個  iOS 開發人員,你應該知道 Swift 中有 let 和 var 的宣告方式,一般來說, let 會用來宣告不能更改的變數,但 var 會用來宣告可以更改的變數。但真的是這樣嗎?讓我們先看一下以下的例子:

在這個例子中,我們試圖就 array 和 appedndString 宣告成 let,一般來說宣告成 let 就是想讓他不能修改,但以下的例子居然會過,代表 let 指向的是物件的 pointer,若物件的 pointer 沒有修改,則 iOS 會認為 let 所指向的 mutable 變數內容仍是可以修改的。

  1. let array: NSMutableArray = NSMutableArray()
  2. array.add("string1")
  3. array.add(NSNumber(value: 1))
  4. let appendString: NSMutableString = NSMutableString()
  5. appendString.append("hi")

再來看下列的例子,同樣宣告成陣列,但 leftButtonArray 在 append 時則會報錯喔!所以在這裡,你應該要將 leftButtonArray 宣告成 var 才對。

  1. let leftButtonArray : [NSNumber] = []
  2. leftButtonArray.append(NSNumber(value: 1)) //錯誤
  3. let array: NSMutableArray = NSMutableArray()
  4. array.add("string1")
  5. array.add(NSNumber(value: 1))

 

更改完的宣告,這樣就不會出錯啦。

  1. var leftButtonArray : [NSNumber] = []
  2. leftButtonArray.append(NSNumber(value: 1))
  3. let array: NSMutableArray = NSMutableArray()
  4. array.add("string1")
  5. array.add(NSNumber(value: 1))

 

但是,我們再將程式改成以下,就又會出錯了,原因是因為 array = NSMutableArray() 會更改物件指向的 pointer 位置。

  1. let array: NSMutableArray = NSMutableArray()
  2. array.add("string1")
  3. array.add(NSNumber(value: 1))
  4. array = NSMutableArray() //錯誤

 

所以,我們必須再做一點修改,改用 array.removeAllObjects() 來取代 array = NSMutableArray()。

  1. let array: NSMutableArray = NSMutableArray()
  2. array.add("string1")
  3. array.add(NSNumber(value: 1))
  4. array.removeAllObjects()

 

或者,更直接一點,直接將 array 用 var 宣告。

  1. var array: NSMutableArray = NSMutableArray()
  2. array.add("string1")
  3. array.add(NSNumber(value: 1))
  4. array = NSMutableArray()

最後,我們來個總結吧,雖然我們可以透過 let 和 var 宣告變數,但透過 let 來宣告的 Mutable 型態的變數,內容卻是可以增減的。但為了養成良好習慣,但如果變數內容是有可能改變的,我還是會習慣使用 var 來宣告,一方面是可以避免編繹器的錯,一方面是避免讓自己產生混亂喔。