2013-03-12 44 views
2

我有一個塊:問題與Objective-C的語法塊 - 與返回類型的typedef塊和參數

typedef id (^completionBlock)(id data, NSURLResponse *urlResponse, NSError *error); 

而且在一個類的方法我嘗試填充一些代碼塊。

request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){ 
    ... 
return object; 
}; 

requestCompletedBlock顯然是completionBlock類型的。

我收到以下錯誤:

「不兼容的塊指針類型分配給 'completionBlock'(又名 '號(^)(_ 強大的ID,NSURLResponse * _strong,NSError * __強)')從「 void *(^)(_ strong id,NSURLResponse * _strong,NSError * __ strong)'「

顯然我的語法在某處出錯了,但是在哪裏呢?

非常感謝,

Vb的

回答

7

無論出於何種原因,編譯器推斷你的內聯塊的返回類型void*,不id。您可以強制它通過將返回類型^像這樣使用後的id返回類型:

request.requestCompletedBlock = ^id (id data, NSURLResponse *urlResponse, NSError *error) { 
    //       ~~ 
    //      Return type 
} 

塊語法的詳細說明,請參見this page

1

編譯器推斷 「無效*」 的 「對象」 的類型。您可以顯式聲明字面的返回類型,像這樣:

^id(id data, ...) { ... } 
1

你的語法是正確的,它是你錯誤的數據類型。

您的object類型爲void*,但您的區塊希望您返回id。這意味着你要麼換object到,比方說,NSData*

request.requestCompletedBlock = ^(id data, NSURLResponse *urlResponse, NSError *error){ 
    ... 
    return (id)[NSData dataWithBytes:object length:numBytes]; 
}; 

或改變completionBlock申報期待的void*返回類型。