兩種參數(shù)傳遞方式
值類型
傳遞的是參數(shù)的一個副本,這樣在調(diào)用參數(shù)的過程中不會影響原始數(shù)據(jù)。
引用類型
把參數(shù)本身引用(內(nèi)存地址)傳遞過去,在調(diào)用的過程會影響原始數(shù)據(jù)。
在 Swift 眾多數(shù)據(jù)類型中,只有 class 是引用類型,
其余的如 Int、Float、Bool、Character、Array、Set、enum、struct全都是值類型.
讓值類型以引用方式傳遞
有時候我們需要通過一個函數(shù)改變函數(shù)外面變量的值(將一個值類型參數(shù)以引用方式傳遞),
這時,Swift 提供的 inout 關(guān)鍵字就可以實現(xiàn)。
舉例:
/// 以下代碼已更新到 Swift 4.0
var value = 50
print(value) // 此時value值為50
func increment(_ value: inout Int, _ length: Int = 10) {
value += length
}
increment(&value)
print(value) // 此時 value 值為60,成功改變了函數(shù)外部變量 value 的值
即:聲明函數(shù)時,在參數(shù)類型前面用 inout 修飾,函數(shù)內(nèi)部實現(xiàn)改變外部參數(shù)
傳入?yún)?shù)時(調(diào)用函數(shù)時),在變量名字前面用 & 符號修飾表示,表明這個變量在參數(shù)內(nèi)部是可以被改變的(可將改變傳遞到原始數(shù)據(jù))
注意
- inout 修飾的參數(shù)是不能有默認值的(例子中 length = 10被賦予默認值),有范圍的參數(shù)集合也不能被修飾;
- 一個參數(shù)一旦被 inout 修飾,就不能再被 var 和 let 修飾了。