八
.捕獲上下文中的變數和常量
1. 閉包可以用訪問或修改閉包所在上下文中的變數或常量(對於常量只是訪問),這個過程被稱為捕獲。
2. 即使定義這些變數或常量的作用域已經不存在了,閉包也依然可以訪問或修改他們。
3. swift
中最簡單的閉包形式就是巢狀函式
,巢狀函式可以捕獲它所在的封閉韓式的變數、常量或引數。舉個栗子:
//定義乙個函式,該函式返回值的型別為
() -> [string]
func makearray(ele : string) -> () -> [string]
return addele
}上面的函式
makearray
中的巢狀函式
addele()
函式沒有定義任何引數,也沒有定義任何變數,但該巢狀函式可以訪問
arr變數和
ele形參。這是因為巢狀函式捕獲了其所在上下文中但變數。
****----
很容易理解,主要是看
makearray()
函式中的變數的作用域的範圍。
4. 每個閉包都會持有乙個它捕獲的變數的
副本,為了證明,我們只需列印一下即可:
let result1 = makearray(ele:"swift")
print(result1()) ----
注意這裡一定要用
result1加()
的方式入引數,不然列印的是關鍵字
function
print(result1()) ----
注意這裡一定要用
result1加()
的方式入引數,不然列印的是關鍵字
function,
並且只列印乙個。
//結果是:
[swift]
[swift, swift]
let result2 = makearray(ele:"bibao")
print(result2()) //
輸出:[bibao]
print(result2()) //
輸出:[bibao,bibao]九.
閉包是引用型別
1. 上面的例子中,
result1
,result2
都是常量,但這些常量所引用的閉包依然可以改變它們底層持有的
arr副本,這是因為函式和閉包都是引用型別。
2. 當把乙個函式或者閉包賦值給乙個變數或常量時,程式並未真正使用該變數或常量來儲存這個函式或閉包,程式只是讓該變數引用了被賦值的函式或閉包,所以該變數成為了引用型別的。
----
也就是說,當程式把乙個閉包賦值給兩個引用變數時,程式並不會複製它們,而是讓兩個引用變數都指向同乙個閉包。例如在上面的例子中再新增以下**:
let result3 = result2
print(result3) //
輸出[bibao,bibao,bibao]
print(result3) //
輸出[bibao,bibao,bibao,bibao]
以上就是閉包的基本的內容。
每天學一點Swift 泛型 一
一 泛型的作用 1.泛型是一種非常靈活的語法,泛型允許程式在函式 列舉 結構體 類中定義型別形參,這種型別形參實際代表的型別是動態改變的 程式可以等到真正使用這些函式 列舉 結構體時才為這些型別形參傳入實際的型別。而且每次使用這些函式 列舉 結構體 類時都可以為泛型的型別形參傳入不同的型別。2.例項...
每天學一點(一)
記錄學習內容 js中對於函式的建立,在使用函式表示式和函式宣告相結合時,正確寫法為 var sum function sum a,b console.log sum 1,2 輸出3 若定義的變數和函式名稱書寫不一致,則會產生錯誤。var sum1 function sum2 a,b console....
每天學一點Swift 物件導向上 十二
十四 構造器 1.構造器用於完成例項的構造過程。這個過程包括為例項中的每個儲存屬性設定初始值和執行必要的準備和初始化任務。2.swift 的構造器本質上就是乙個或多個名為 init 的函式 不允許使用 func 關鍵字 3.構造器的主要作用就是完成例項中每個類 結構體中例項儲存屬性 列舉不能定義例項...