在 Swift 中,一個 function 傳入的參數無法直接改變它的值,先看一個例子:

func incrementAndPrint(_ value: Int) {
  value += 1
  print(value)
}

// 摘錄自: By Greg Heo, Update by Ray Fix. 「Swift Apprentice」。 iBooks.

這段程式碼試圖增加1點參數值 “value”,而complier此時會產生以下 error:

「Left side of mutating operator isn't mutable: 'value' is a 'let' constant」 

摘錄自: By Greg Heo, Update by Ray Fix. 「Swift Apprentice」。 iBooks.

會產生這個 error 是因為,Swift 的 function 中的參數都是以 pass-by-value 的方式傳遞,當 value 傳遞到 function 內,value 會先 copy 一份(也就是 let _value = value),因此 function 中的參數預設都是以常數為型態,無法修改。

那如果在有些需求當中,我們就是想要直接修改參數值呢?這時就要用到 inout 這個關鍵字:

inout copy-in copy-out 的意思,也有人稱為 call by value result,顧名思義,加上 inout 後的行為就是 copy 一份進來,再 copy 一份出去,所以剛剛的程式碼可以改為:

func incrementAndPrint(_ value: inout Int) {
  value += 1
  print(value)
}

// 摘錄自: By Greg Heo, Update by Ray Fix. 「Swift Apprentice」。 iBooks.

設定一個數值為 5 的變數 value,帶入 incrementAndPrint 後印出 value 的值,可以看到 value 的值被 +1 成為 6:

var value = 5
incrementAndPrint(&value)
print(value)
// print 6

// 摘錄自: By Greg Heo, Update by Ray Fix. 「Swift Apprentice」。 iBooks.