Swift學習筆記7 關閉

2021-09-07 02:48:24 字數 2164 閱讀 5524

閉包引用和將其儲存在任意常量和變數的上下文。 swift 你會管理捕獲過程中涉及到的記憶體操作。

在 函式 章節中介紹的全域性和巢狀函式實際上也是特殊的閉包,閉包採取例如以下三種形式之中的乙個:

1. 全域性函式是乙個有名字但不會捕獲不論什麼值的閉包

2. 巢狀函式是乙個有名字並能夠捕獲其封閉函式域內值的閉包

3. 閉包表示式是乙個能夠捕獲其上下文中變數或常量值的沒有名字的閉包

一、閉包表示式

閉包函式類似於objective-c中的block。以下我們用事實說話:

let counts = [3,2,5,1,6]

//********** 方法1:使用普通函式*******

func sortinc(item1:int,item2:int) ->bool

sort(counts, sortinc)

//********** 方法2:使用閉包函式*******

sort(counts,

關鍵:閉包表示式主要分為3個部分

①閉包表示式全部內容都由大括號{}括起來

②閉包表示式keywordin前面部分和函式的定義是一樣的。僅僅是去掉了func和函式名

③閉包表示式keywordin後面部分是函式的詳細**

2) 依據上下文判斷型別

由於排序閉包是作為函式的引數進行傳入的。swift能夠判斷其引數和返回值的型別。上面的方法2中的**能夠改為以下的形式:

sort

(counts

, )  

//$0

和$1

表示閉包中第乙個和第二個

int型別的引數。

看!swift的閉包多洋氣啊。居然能夠簡化成這樣

5)運算子函式

實際上另一種更簡單的方法。swift中《符號能夠作為乙個函式來使用

sort

(counts

, <)

2.trailing 閉包

假設您須要將乙個非常長的閉包表示式作為最後乙個引數傳遞給函式。能夠使用 trailing 閉包來增強函式的可讀性。

trailing 閉包是乙個書寫在函式括號之外(之後)的閉包表示式。函式支援將其作為最後乙個引數呼叫。上面的樣例用trailing 閉包形式表達例如以下

sort

(counts

)  

//$0

和$1

表示閉包中第乙個和第二個

int型別的引數。

注意:假設函式僅僅須要閉包表示式乙個引數。當您使用 trailing 閉包時,您甚至能夠把 () 省略掉。

3.捕獲 (caputure)

閉包能夠在其定義的上下文中捕獲常量或變數。

即使定義這些常量和變數的原域已經不存在。閉包仍然能夠在閉包函式體內引用和改動這些值。

func makeincrementor(forincrement amount: int) -> () -> int 

return incrementor

}

注意:swift 會決定捕獲引用還是拷貝值。

您不須要標註 amount 或者 runningtotal 來宣告在嵌入的 incrementor 函式中的使用方式。 swift 同一時候也處理 runingtotal 變數的記憶體管理操作,假設不再被 incrementor 函式使用,則會被清除。

2) 閉包是引用型別

函式和閉包都是引用型別。閉包的賦值都是指標賦值。這意味著假設您將閉包賦值給了兩個不同的常量/變數,兩個值都會指向同乙個閉包:

func makeincrementor (forincrement amount: int) -> () -> int 

return incrementor

}let incrementbyten = makeincrementor(forincrement: 10)

let a = incrementbyten

這裡a和

incrementbyten

都是指標,都他們中乙個的值改變,還有乙個會隨著一起改變

swift學習筆記

1 值永遠不會被隱式轉換為其他型別。如果你需要把乙個值轉換成其他型別,請顯式轉換。let label the width is let width 94 let widthlabel label string width could not find an overload for that acc...

Swift學習筆記

常量 let product constant iphone6 變數 var product var ipad 不需要宣告變數型別,會根據右側的值推導左側變數的型別 可以多個變數定義在一起 var x1 30,x2 abc 可以精確指定變數的型別 var x1 int 27 指定x1為int型 pr...

Swift 學習筆記

函式的閉包 函式閉包的好處 利用上下文推斷引數和返回值型別 隱式返回單表示式閉包,即單表示式閉包可以省略 return 關鍵字 引數名稱縮寫 尾隨閉包語法 閉包的寫法 根據上下文推斷型別 因為排序閉包函式是作為 sorted by 方法的引數傳入的,swift 可以推斷其引數和返回值的型別。sort...