2017-08-31 36 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 
    })