2017-02-28 18 views
2

我剛剛開始在Swift中實現我們的一些新功能而不是Objective-c,到目前爲止一切正常,但令我困惑的一件事是如何正確使用Obj- C在斯​​威夫特塊。在Swift中使用Objective-C塊時保留參數類型

在我的OBJ-C級的我已經定義了一個塊被用來處理呼叫我們的API HTTP響應:

typedef void(^CCAPIClientRequestCompletionBlock)(id response, NSArray *messages, NSDictionary *metaData, NSError *error); 

這在下面的方法使用:

-(void)createMeetingWithUsers:(NSArray *)users subject:(NSString *)subject andDescription:(NSString *)description withCompletionBlock:(CCAPIClientRequestCompletionBlock)completionBlock; 

我現在正在編寫一個API客戶端來訪問Swift中的新API,並試圖將該塊作爲閉包重用。下面的代碼生成並運行:

apiClient.createMeeting(withUsers: userIds, subject: subject, andDescription: description) { (response, messages, metaData, error) -> Void in 

    } 

,但我希望能夠保持的參數類型,我想我應該可以做一些事情,如:

apiClient.createMeeting(withUsers: userIds, subject: subject, andDescription: description) { (response:Any?, messages:[Any], metaData:[AnyHashable:Any], error:NSError) -> Void in 

    } 

但是當我嘗試這一點,我收到一個錯誤:

Cannot convert value of type '(Any?, [Any], [AnyHashable : Any], NSError) -> Void' to expected argument type 'CCAPIClientRequestCompletionBlock!' 

我在這裏錯過了什麼?

+0

您沒有任何空性屬性聲明,但不知爲何,你期望的響應是可選的。那可能怎麼樣? – Andy

回答

0

你應該改變所有類型可選項,並NSErrorError?

apiClient.createMeeting(withUsers: userIds, subject: subject, andDescription: description) { (response:Any?, messages:[Any]?, metaData:[AnyHashable:Any]?, error:Error?) -> Void in 
    //TODO 
} 
+0

剛剛嘗試過,仍然給我同樣的錯誤。 – darkbreed

+1

Swift已經將它們視爲未包裝的可選項。嘗試使其明確apiClient.createMeeting(withUsers:userIds,subject:subject,andDescription:description){(response:Any ?, messages:[Any] !, metaData:[AnyHashable:Any] !, error:NSError!) - >無效 } – Brett

+0

這樣做!謝謝。 – darkbreed

相關問題