block塊是隨os x v10.6和ios 4.0一同發布並可用的功能,其功能類似於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);
這個地方"(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()
}
既然閉包可以"逃逸",那麼就會存在不可"逃逸"的情況。那麼什麼情況下閉包不可以"逃逸"呢,答案是函式返回之後,閉包仍然需要使用的情況下。舉個例子,如開發過程中最常見的,網路請求,通常都是非同步的,等伺服器返回結果後,我們通常才會呼叫成功後的閉包進行諸如介面的重新整理工作等。如下**:
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一同發布並可用的功能 在這個swift2.0都出來了的時候,不用考慮block版本是否可用的問題 其功能類似於c語言的函式。但是與c語言函式不同在於block可以訪問與之在同乙個作用域的變數。1 block塊 swift閉包實體定義 block指標...
Swift閉包2 尾閉包
假設有這樣乙個函式 這個函式的最後乙個引數是乙個閉包,並且,這個閉包表示式很長。如果按照正常的方式來呼叫這個函式的話,需要在引數裡指明這個函式的引數名,然後後面跟著乙個閉包表示式。比如下面這種函式 func somefunctionthattakesaclosure closure void 正常的...
Swift基礎 閉包
閉包是自包含的函式 塊,可以在在 中被傳遞和使用。閉包能捕獲和儲存騎在上下文中任意常量和變數的引用。這就是所謂的閉合幷包裹著這些常量和變數,俗稱閉包。swift會為我們管理在捕獲過程中設計的所有記憶體操作。閉包表示式式一種利用簡潔語法構建內聯的方式 2.1 sorted函式 swift標準庫提供了s...