如何将Objective-C块转换为Swift闭包

时间:2017-08-31 06:15:59

标签: swift swift3 closures objective-c-blocks

我有一个方法,其中包含一个在Objective-C:

中定义的块
+(void)getNewList:(NewListRequestModel *)model returnInfo:(void(^)(NewListResponseModel* resModel))retModel;

我将其调用为:

[API getNewList:model returnInfo:^(NewListResponseModel *resModel) {
      //code
}];
目标-C中的

现在我想在Swift 3.2中调用它:

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

  })

但我总是遇到错误:

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

有人可以帮我正确地调用它吗?感谢。

3 个答案:

答案 0 :(得分:4)

在Swift中,可以很容易地编写闭包。编译器为您推断出参数类型和返回类型,因此您需要做的就是编写参数名称in

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

您还可以使用尾随闭包语法:

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

发生错误是因为resModel实际上是可选类型。在最初的Objective-C代码中,resModel是一个指针,可以为null。当这被桥接到swift时,它变成NewListResponseModel?

答案 1 :(得分:2)

试试这个:

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


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

})

答案 2 :(得分: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 
    })