2017-08-31 25 views
0

我有一個包含這在目的限定的塊的方法 - C:如何Objective-C的塊轉換爲夫特閉合

+(void)getNewList:(NewListRequestModel *)model returnInfo:(void(^)(NewListResponseModel* resModel))retModel; 

和我調用它喜歡:

[API getNewList:model returnInfo:^(NewListResponseModel *resModel) { 
     //code 
}]; 

在目的- C 。

現在我想調用它的雨燕3.2:

API.getNewList(model, returnInfo: {(resModel: NewListResponseModel) ->() in 
     //my code  

    }) 

但我總是得到一個錯誤:

Cannot convert value of type '(NewListResponseModel) -> Void' to expected argument type '((NewListResponseModel?) -> Void)!' 

能有人幫我調用它的正確方法?謝謝。

回答

4

在斯威夫特,封鎖可以很容易地編寫。編譯器推斷的參數類型和返回類型,因此,所有你需要做的是寫參數名稱和in

API.getNewList(model, returnInfo: {resModel in 
    //my code  
}) 

您還可以使用尾隨關閉語法:

API.getNewList(model) {resModel in 
    //my code 
} 

的發生錯誤是因爲resModel實際上是可選類型。在最初的Objective-C代碼中,resModel是一個指針,可以爲null。當它被迅速橋接時,它變成NewListResponseModel?

2

試試這個:

class func getNewList(model: NewListResponseModel 
    returnInfo: ((_ resModel: NewListResponseModel?) -> Void)?){ 
    } 


API.getNewList(model, returnInfo: {(resModel) in 
    //my code  

}) 
+0

你的意思是它改寫成快捷功能?但如果我不想重寫它,只需調用objective-c方法即可。你能說出正確的方法嗎? – Neko

+0

在橋接頭文件中導入目標-c類並調用該函數。 – Pushpendra

+0

它的工作原理,謝謝! – Neko

2

// MARK:類函數傳遞requestModel並得到響應模型

class func getNewList(model: NewListRequesstModel, completion: @escaping (returnModel: NewListResponseModel) -> Void) { 
      //Your code to get new model for retrun 
    } 

API.getNewList(model: newModelObject, completion: { (retunModelobject) in 
     //your code 
    })