在swift中,我們常常對數據進行一些處理。因為swift的計算屬性,所以如果不是大量重復性處理,基本可以在set及didSet中改變原數據的一些狀態。但需要用到同樣的算法處理大量數據的時候,仍然需要寫方法來解決。在如C一類的傳統語言中,指針變量能輕易幫我們處理並直接修改掉原數據,而apple本身期望siwft中盡量減少指針的出現,因此,swift常規方法中經常用到的是值傳遞。值傳遞最明顯的后果便是無法對原數據進行直接修改。如果我們需要處理后的數據結果,那么就需要重新定義一個變量來接收值。在原數據被廢棄的情況下,這樣既增多了代碼量,也產生了空間大量浪費。因此 siwft提供了關鍵字修飾inout來申明數據地址傳遞,也稱之為引用傳遞。在siwft3.0中 inout的位置發生了改變,處於標簽位置,不過其作用相同。具體作用如下圖代碼:
以上代碼是一個簡單的冒泡排序。輸出內容分別是排序結果和經過第一次、第二次調用方法后的原始數據。認真看一下代碼的不同,就能很輕易的了解inout的作用了。在沒有經過inout修飾參數中,傳入數組,對數組進行排序。但無法影響原數組。當我們需要對處理后的數據結果進行操作的時候,就不得不定義新的變量來存儲處理后的數組結果,而在第二個排序方法中,傳入的是需要排序的數組地址,導致數組本身被影響,其原值也被修改。如果需要對結果進行操作,可以直接使用原數據。因此,無需返回數據,其正確代碼如下:
在siwft中,除了class是默認引用傳遞外,其他數據類型如float,struct等等都屬於值傳遞。如果我們在對其進行處理的時候希望能夠在函數中直接對其原值進行修改直接修改,那么最好的方法就是直接使用inout來修飾傳入參數,值得注意的是inout 無法修飾帶有默認值的參數且經過inout修飾之后,無法再被let和var修飾