在 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.