Swift基礎 閉包

2021-08-30 04:44:55 字數 2283 閱讀 6639

閉包是自包含的函式**塊,可以在在**中被傳遞和使用。 閉包能捕獲和儲存騎在上下文中任意常量和變數的引用。這就是所謂的閉合幷包裹著這些常量和變數,俗稱閉包。 swift會為我們管理在捕獲過程中設計的所有記憶體操作。

閉包表示式式一種利用簡潔語法構建內聯的方式=

##2.1 sorted函式

swift標準庫提供了sorted函式,會格局我們提供的基於輸出型別排序的閉包函式將一已知型別陣列中的值進行排序,一旦排序完成,函式警徽返回乙個與原陣列大小相同的新陣列,該陣列中包含已經正確排序的同型別元素

sorted函式需要傳入以下兩個引數:

let number: [int] = [1,4,8,4,6,2]

func compare(num1: int, num2: int) -> bool

let newnumber = number.sorted(by: compare)

print("newnubmer:\(newnumber)")

out:

newnubmer:[8, 6, 4, 4, 2, 1]

閉包表示式語法的一般形式如下:

/*

*/

因為排序比好函式是作為sorted函式的蠶食傳入的,所以swift可以推斷引數和返回值的型別。sorted期望第二個引數是型別為(int, int) -> bool 的函式,因此實際 int-int 和bool型別並不需要作為閉包表示式中的一部分。因為所有型別都可以被正確推斷,返回箭頭(->)和圍繞在引數周圍的括號也可以省略。如:

var newnumber1 = number.sorted 

print("newnumber1:\(newnumber1)")

out:

newnumber1:[8, 6, 4, 4, 2, 1]

如果閉包的雨季只有單行表示式,可以吧return關鍵字省略,如:

var newnumber2 = number.sorted 

print("newnumber2:\(newnumber2)")

out:

newnumber2:[8, 6, 4, 4, 2, 1]

swift 自動為內聯函式提供了引數名稱縮寫功能,我們可以直接通過「$0,$1,$2,$3」(0是第乙個引數)來順序呼叫閉包的引數。

如果在閉包表示式中使用引數名稱縮寫,我們可以在閉包引數列表中省略對其的定義,並且對應引數名稱縮寫的型別會通過函式型別進行推斷,in關鍵字頁同樣可以省略,應為此時辯駁啊表示式完全由閉包函式體構成,如:

var newnumber3 = number.sorted 

print("newnumber3:\(newnumber3)")

out:

newnumber3:[8, 6, 4, 4, 2, 1]

如果閉包是函式的最後乙個引數,則可以吧閉包移到函式後面,這種方法用於閉包表示式豫劇比較多的情況,如:

var result = number.map
閉包可以在其定義的上下文中捕獲常量或變數。及時定義這些常量和變數的原域不存在了,閉包依然可以在閉包函式體內引用和修改這些值。swift最堅定的閉包形式是巢狀函式,也就是定義在其他函式體內的函式。巢狀函式可以捕獲器外部函式所有的引數一級定義的變數和常量。如:

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

return incrementer

}let incrementbyten = makeincrementer(forincrement: 10)

print("1:\(incrementbyten())")

print("2:\(incrementbyten())")

print("3:\(incrementbyten())")

out:

1:10

2:20

3:30

在上面的例子中,incrementbyten 是常量,但是常量指向的閉包仍然可以正價其捕獲的變數值,這是因為函式和閉包都是引用型別。 無論我們將函式或閉包賦值給乙個常量還是變數,實際上都是講常量或變數的值設定為對應函式或閉包的引用。在上面的例子中,incrementbyten指向閉包的引用是乙個常量,而非閉包內容本身,這也意味著,如果我們將閉包賦值給了兩個不同的常量、變數,兩個值都會指向同乙個閉包。

個人**

微博:順揚sky

掘金:順揚sky

csdn部落格

Swift 基礎入門 協議 閉包

協議 protocol 當協議中有可選實現方法時 該協議前要用關鍵字 objc 修飾,可選實現方法前,用 optional 修飾 objc protocol marrydelegate 必須要實現的 protocol dividdelegate class man person marrydeleg...

Swift程式設計基礎(五) 閉包

閉包是自包含的函式 塊,可以在 中使用或者用來作為引數傳值。swift中的閉包和oc中的blocks比較相似。閉包可以捕獲和儲存所在上下文中任意常量和變數的引用。這就是閉合幷包裹著這些常量和變數,俗稱閉包。閉包有三種形式 1 全域性函式是乙個有名字但不會捕獲任何值的閉包 2 巢狀函式是乙個有名字並可...

Swift基礎(四) 閉包 列舉

目錄 1.閉包 閉包語法規則,閉包簡化,尾隨閉包,捕獲值,閉包是引用型別,非逃逸閉包,自動閉包 2.列舉 switch窮舉列舉,列舉關聯值,列舉的原始值,遞迴列舉 1.閉包 閉包的語法規則 var vararray aaaa gggg bbbb uuuu let varret vararray so...