Block塊 Swift閉包介紹與使用

2021-07-09 12:29:18 字數 3537 閱讀 8995

block塊是隨os x v10.6和ios 4.0一同發布並可用的功能(在這個swift2.0都出來了的時候,不用考慮block版本是否可用的問題),其功能類似於c語言的函式。但是與c語言函式不同在於block可以訪問與之在同乙個作用域的變數。

1、block塊/swift閉包實體定義

block指標定義:

返回值   (^block名字)(引數列);     如:

int (^cube)(int a)

block實體定義:

^(引數列表) ,例如:

^(int a)

(形參列表) -> 返回值型別,swift中函式就是閉包,閉包是函式的一種特殊形式。閉包的幾種格式為:

1)、完整格式

funa( )

2)、無形參的寫法

funa( )

3)、閉包為最後乙個引數

funa()

4)、只有閉包乙個引數

funa

2、block塊使用例子

1)直接使用,而不用block指標定義方式    

int result = ^(int a) (5);         //計算3次冪,將5作為引數傳入

nslog(@"result = %d", result); //輸出125

這個地方"(5)"後面的分號是必須要有的,表示執行這個block塊**,即相當於函式呼叫

2)採用block指標方式,類似函式呼叫方式

int (^cube)(int);                           //宣告乙個cube的block指標(是不是很像函式指標,其實意思一樣)

cube = ^(int a) ; //將block實體指定給cube

int result = cube(5); //呼叫cube,看起來比剛才更整潔,易於理解

nslog(@"result = %d", result); //輸出125

3、swift閉包使用例子

1)完整格式的寫法

let cube:(int) -> int  = 

print("result = " + "\(cube(5))")

2)無形參格式的寫法

let test = 

test()

3)閉包作為最後乙個引數的寫法

我們首先定義乙個帶閉包引數的函式,如下:

//傳入兩個整形數,輸出這個兩個數之和,加上這兩個數之積,得到的結果

func outputresult(a: int, b: int, multiply: (int, int) -> int)

呼叫函式outputresult,如下:

//此處最後乙個閉包引數,被直接寫在outputresult函式呼叫之外,乍一看還以為是outputresult函式的函式體內容

oupputresult(3, b: 4)

4)閉包引數作為唯一引數的寫法

我們首先定義乙個僅帶唯一閉包引數的函式,如下:        

func closureswithoneparameter(multiply: (int, int) -> int)
呼叫函式closureswithoneparameter,如下:

//此處僅有閉包引數,因此呼叫方法的一對小括號被省略

closureswithoneparameter

4、閉包"逃逸"問題

閉包"逃逸"是指,當乙個閉包被作為引數傳入函式時,這個閉包在函式返回後才會被執行,即閉包不會在函式體內執行。swift1.2中增加了@noescape屬性來防止閉包"逃逸"問題。

什麼情況下,我們可以使用@noescape屬性防止閉包引數"逃逸"出函式體呢?通常的原則是,該閉包確保在函式執行結束之後就沒有用了,我們可以加@noescape屬性。舉例如sort(_:)函式,它接收乙個排序閉包作為引數來進行排序,排序結束後該閉包肯定就沒有用了,這時就可以新增@noescape屬性。其宣告如下:

public func sort(@noescape isorderedbefore: (self.generator.element, self.generator.element) -> bool) -> [self.generator.element]

import uikit

class viewcontroller: uiviewcontroller

func dosomething()

}//此處的@noescape強調了closure閉包在函式返回後即無用了,同時可以保證隱式使用self變數

func funcwithescapingclosure(@noescape closure: () -> void)

override func didreceivememorywarning()

}

別學我,我懶,沒有單獨寫乙個類說明這個,而是直接在工程自動生成的viewcontroller裡面寫開了例子**:)

既然閉包可以"逃逸",那麼就會存在不可"逃逸"的情況。那麼什麼情況下閉包不可以"逃逸"呢,答案是函式返回之後,閉包仍然需要使用的情況下。舉個例子,如開發過程中最常見的,網路請求,通常都是非同步的,等伺服器返回結果後,我們通常才會呼叫成功後的閉包進行諸如介面的重新整理工作等。如下**:

var completionhandlers: [() -> void] = 

func funcwithescapingclosure(completionhandler: () -> void)

注:在swift的閉包引數中,預設就是可"逃逸"的,無需特殊說明

5、自動閉包

swift1.2中又增加了另外乙個新屬性@autoclosures,說白了該屬性就是為了在呼叫閉包時,少寫一對{}而已。@autoclosures修飾符使用要求是:

1)修飾無引數的閉包

2)閉包中僅有一條執行語句,多了不靈

定義兩個函式,乙個帶@autoclosures,另乙個不帶:

func printwithautoclosurename(@autoclosure nameprovider: () -> string) 

func printnoautoclosurename(nameprovider: () -> string)

呼叫語句如下:

var names: [string] = ["張三", "李四"]

printwithautoclosurename(names.removeatindex(0)) //輸出"name = 張三"

printnoautoclosurename

Block塊 Swift閉包介紹與使用

block塊是隨os x v10.6和ios 4.0一同發布並可用的功能,其功能類似於c語言的函式。但是與c語言函式不同在於block可以訪問與之在同乙個作用域的變數。1 block塊 swift閉包實體定義 block指標定義 返回值 block名字 引數列 如 int cube int a bl...

Swift閉包2 尾閉包

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

Swift基礎 閉包

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