第六章:函式(function)
6.4 inout引數和可變方法(inout parameter and mutating function)
知識點: inout 關鍵字:就是改變傳遞給函式的引數,讓引數變得可變(swift 中方法的引數預設都是 let 不可變的)
inout做的事情就是把一個值傳遞給函式,函式可以改變這個值,然後將原來的值替換,並傳遞出來。
並不是傳遞引用
什麼樣的表示式可以當作inout引數去傳遞?
先來弄懂兩個c++中的概率。 lvalve
(變數)和 rvalve
(不是變數)
如array[2] = 4 lvalue
= rvalue
- lvalue估計來源於left value。 位置處於左邊。就是
可以修改
的值。 - rvalue估計來源於right value。處於賦值語句右邊,是隻讀的
不可修改
的值。 資料來源:關於lvalve 和 rvalve 感興趣的同學可以看看。 inout引數,只能傳遞lvalve給它。因為不可能對一個rvalve進行改變。
注: 每個lvalve前面需要加上&符號將它傳入(swift中的自動補全會幫我們加上& ?)
[圖片上傳失敗...(image-6ded17-1547615689035)]
inout的基本使用
知識點:只讀屬性(只有get方法)無法作用於inout引數
tips:swift文件指出 我們不應該依賴inout
這個行為
巢狀函式和inout
可以在巢狀函式
中使用一個inout引數
[圖片上傳失敗...(image-949a35-1547615689035)]
注: 我們不能讓這裡的inout引數逃逸@escaping
(原因:inout的值會在函式返回之前賦值回去,逃逸會增加inout引數的生命週期
,如果延時返回回去賦值,原來的值不存在了,就妥妥的不安全
啊~)
@escaping 的用法後面會講。 你急的話可以先自己百度。預設大家都很優秀,知道是什麼用法~
&不意味inout的情況
&除了講變數傳遞給inout, 還可以將變數轉化為不安全的指標
。
[圖片上傳失敗...(image-6cae5-1547615689035)]
這裡的&使用就不是inout語義了,是將可憐的變數轉化成了不安全的指標。