en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

12.16.2012

Blocks!你不得不學習的 iOS 4 coding 新技術!

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 的所運行的程式碼。

接下來我們來測試一下 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 程式碼樣板一文。






沒有留言:

張貼留言