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

How to convert Objective-C block to Swift closure

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

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

我这样调用它:

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

在 Objective - 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)!'

谁能帮我找到调用它的正确方法?谢谢。

试试这个:

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


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

})

在Swift中,闭包的编写非常简单。编译器会为您推断参数类型和 return 类型,因此您需要做的就是编写参数名称和 in:

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

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

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

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

//MARK: Class 传递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 
    })