Blocks 並不是要去阻擋什麼東西,Blocks 是雪豹作業系統以及 iOS 4 的新 coding 方式。Block 其實是一段由兩個大括弧所包含的程式碼,類似函數一樣,但是不需要在使用前先行在 .m 檔案裡面宣告,只要在你需要用到的時候,寫一個程式碼的區塊也就是 Block,然後利用他來執行所需的工作就可以了。
我們來看看 Block 的宣告方式:
int (^WeAreBlocks) (int) = ^(int number) {return number*3}
第一個 int,如同我們宣告函式一樣,我們宣告 WeAreBlocks 這個 Block 變數的回傳值是int型態。接下來括弧內我們指定 Block 的名稱為 WeAreBlocks,其中一個最重要的符號是 ^ 這是告訴編譯器我要宣告 WeAreBlocks 為這個 Block 的名稱。第三個在括弧內的 int 為提供給 Block 的參數。
接著到等號的右邊,先使用 Block 的宣告符號 ^,在接下來的括弧內宣告型態及變數,而這個變數是當做提供給後方大括弧內的程式碼所使用的輸入參數。最後大括弧內含的即為這個 Block 的所運行的程式碼。
//宣告整數型態變數aNumber
int aNumber = 5;
//宣告不需要回傳以及不需要輸入參數的output block
void (^output)(void) = ^{
NSLog(@"Print out aNumber: %d", aNumber);
};
//執行output block
output();
以下是執行結果,執行結果為 "Print out aNumber: 5"
以上的範例沒有設定回傳以及輸入值,因此是以 void 為代表。Blocks 不需要在你所屬的方法 (method) 區塊外撰寫,只要在你的方法區塊中宣告以及寫好 Block 的程式碼,就可以直接呼叫執行了。Easy to use!!
Block 也同樣可以當做方法函式的參數來使用,像是當某方法函式完成或失敗時需要呼叫到其他未知的函式,就可以宣告成以下這樣:
- (void)doSomething completion:(void (^)(void))completion error:(void (^)(void))error {
if (somtething) {
error();
return;
}
//do something
//...
completion();
}
在使用上如果不想將 Block 直接撰且在呼叫方法函式的地方時,則必宣先對該 block 做宣告。
void (^completion)(void) = ^{
NSLog(@"Finish");
};
void (^error)(void) = ^{
NSLog(@"Error");
};
[self doSomething completion:completion error:error];
另外,其他像是 Block 帶有輸入與回傳的宣告方式,或是 typedef 寫法,都可以在位於 Xcode 右下角的 Code Snippet Library 中找到範例,關於 Code Snippet Library 請參閱關於 XCODE 4 中的 Code Snippet Library 程式碼樣板一文。
沒有留言:
張貼留言