Swift那些事兒 閉包(捕獲值)

2021-09-16 12:51:38 字數 955 閱讀 5046

參考:

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

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

swift最簡單的閉包形式是巢狀函式,也就是定義在其他函式的函式體內的函式。

巢狀函式可以捕獲其外部函式所有的引數以及定義的常量和變數。

import cocoa

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

return incrementor

}//函式內部的變數runningtotal能取得

let incrementbyten = makeincrementor(forincrement: 10)

// 返回的值為10

print(incrementbyten())

// 返回的值為20

print(incrementbyten())

// 返回的值為30

print(incrementbyten())

分析:

乙個函式makeincrementor ,它有乙個int型的引數amout, 並且它有乙個外部引數名字forincremet,意味著你呼叫的時候,必須使用這個外部名字。返回值是乙個()-> int的函式。

函式體內,宣告了變數runningtotal 和乙個函式incrementor(內部函式)。

incrementor函式並沒有獲取任何引數,但是在函式體內訪問了runningtotal和amount變數。這是因為其通過捕獲在包含它的函式體內已經存在的runningtotal和amount變數而實現。

由於沒有修改amount變數,incrementor實際上捕獲並儲存了該變數的乙個副本,而該副本隨著incrementor一同被儲存。

※incrementbyten 可以取得函式內部的變數

JS 閉包的那些事兒

簡而言之 內部函式被外部函式之外的其他變數引用時,就形成了閉包。在js裡,如果乙個物件不再被引用時,就會被gc 否則就一直儲存在記憶體中。當我們需要在模組中定義一些變數,並希望這些變數一直儲存在記憶體中但又不會 汙染 全域性的變數時,就可以用閉包來定義這個模組。functiona returnb v...

Swift 函式式程式設計 捕獲 閉包記憶體管理

import uikit varwords abd angry anger hungry words filter 按閉包的規則篩選 map 按閉包的規則轉換,map並不修改原數值的內容,只是返回處理後的新陣列 reduce oxox combine 按閉包規則組合三個字串 上面三個方法其實是在一行...

Swift閉包2 尾閉包

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