Swift特有語法 閉包

2022-03-26 01:47:24 字數 2932 閱讀 5849

1. 閉包定義

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

閉包採取如下三種形式:

2. sort函式

sorted 函式(the sorted function):swift 標準庫提供了sorted函式,會根據您提供的基於輸出型別排序的閉包函式將已知型別陣列中的值進行排序。 一旦排序完成,函式會返回乙個與原陣列大小相同的新陣列,該陣列中包含已經正確排序的同型別元素。

sorted函式需要傳入乙個引數:

我們通過sorted函式,使用閉包進行排序,**如下:

let names = ["

chris

", "

alex

", "

ewa", "

barry

", "

daniella"]

func backwards(s1 : string, s2 : string)->bool

let reversed =names.sort(backwards)

for item in

reversed

3. 閉包表示式語法(closure expression syntax)

優化了backwards函式對應的閉包表示式版本的**:

let reversed = names.sort()

根據上下文推斷型別(inferring type from context):實際上任何情況下,通過內聯閉包表示式構造的閉包作為引數傳遞給函式時,都可以推斷出閉包的引數和返回值型別,優化後**如下:

let reversed = names.sort()

引數名稱縮寫(shorthand argument names):swift 自動為內聯函式提供了引數名稱縮寫功能,您可以直接通過$0,$1,$2來順序呼叫閉包的引數。優化後**如下:

let reversed = names.sort()

4. 尾隨閉包

尾隨閉包(trailing closures):如果需要將乙個很長的閉包表示式作為最後乙個引數傳遞給函式,可以使用尾隨閉包來增強函式的可讀性。 尾隨閉包是乙個書寫在函式括號之後的閉包表示式,函式支援將其作為最後乙個引數呼叫。

下例介紹了如何在map方法中使用尾隨閉包將int型別陣列[16,58,510]轉換為包含對應string型別的陣列["onesix", "fiveeight", "fiveonezero"],**如下:

let digitnames = [0: "

zero

", 1: "

one", 2: "

two", 3: "

three

", 4: "

four",

5: "

five

", 6: "

six", 7: "

seven

", 8: "

eight

", 9: "

nine"]

let numbers = [16, 58, 510

] let strings =numbers.map

return

output

}for item in

strings

4.1 swift中map

map函式會遍歷集合型別並對其中的每乙個元素進行同一種的操作。map的返回值是乙個所得結果的陣列。例如:我們要對乙個陣列裡面的資料進行平方操作,常見的**如下:

let values: [double]= [2.0,4.0,6.0,8.0

]var squares: [double] =

for value in

values

上面的**中,我們使用了常規的for in遍歷操作對其中的元素進行了平方操作,然後將計算的結果追加到乙個變數陣列裡面。雖然該部分的**很好的完成了要求,但是在swift中我們還有更簡潔和安全的**(上面的squaers是乙個變數可能出現無意的資料修改)。下面來看看使用map進行操作的**:

let values: [double]= [2.0,4.0,6.0,8.0

]let squares: [double] = values.map

//該段**不僅更加簡潔而且squares是乙個不可變的常量。

5. 捕獲值

捕獲值(capturing values):閉包可以在其定義的上下文中捕獲常量或變數。 即使定義這些常量和變數的原域已經不存在,閉包仍然可以在閉包函式體內引用和修改這些值。**如下:

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

return

incrementor

}let incrementbyten = makeincrementor( forincrement: 10

) let number =incrementbyten()

print(

"incrementbyten = \(number)

")

makeincrementor返回型別為() -> int。 這意味著其返回的是乙個函式,而不是乙個簡單型別值。 該函式在每次呼叫時不接受引數只返回乙個int型別的值。 

swift5 基本語法 閉包

在swift中,說到閉包表示式 closure expression 我們就能想起來objective c中的block,確實兩者之間非常相似,功能也基本相同,都可以在 中使用或者用來作為引數傳值。我們一起來學習下swift中的閉包用法。在swift中,可以通過func定義乙個函式,也可以通過閉包表...

Swift閉包2 尾閉包

假設有這樣乙個函式 這個函式的最後乙個引數是乙個閉包,並且,這個閉包表示式很長。如果按照正常的方式來呼叫這個函式的話,需要在引數裡指明這個函式的引數名,然後後面跟著乙個閉包表示式。比如下面這種函式 func somefunctionthattakesaclosure closure void 正常的...

Swift基礎 閉包

閉包是自包含的函式 塊,可以在在 中被傳遞和使用。閉包能捕獲和儲存騎在上下文中任意常量和變數的引用。這就是所謂的閉合幷包裹著這些常量和變數,俗稱閉包。swift會為我們管理在捕獲過程中設計的所有記憶體操作。閉包表示式式一種利用簡潔語法構建內聯的方式 2.1 sorted函式 swift標準庫提供了s...