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

Nek*_*eko 0 closures objective-c-blocks swift swift3

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

+(void)getNewList:(NewListRequestModel *)model returnInfo:(void(^)(NewListResponseModel* resModel))retModel;
Run Code Online (Sandbox Code Playgroud)

我像这样调用它:

[API getNewList:model returnInfo:^(NewListResponseModel *resModel) {
      //code
}];
Run Code Online (Sandbox Code Playgroud)

在 Objective-C 中。

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

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

  })
Run Code Online (Sandbox Code Playgroud)

但我总是遇到错误:

Cannot convert value of type '(NewListResponseModel) -> Void' to expected argument type '((NewListResponseModel?) -> Void)!'
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我以正确的方式调用它吗?谢谢。

Swe*_*per 6

在 Swift 中,可以非常轻松地编写闭包。编译器会为您推断参数类型和返回类型,因此您只需编写参数名称和in

API.getNewList(model, returnInfo: {resModel in
    //my code     
})
Run Code Online (Sandbox Code Playgroud)

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

API.getNewList(model) {resModel in
    //my code
}
Run Code Online (Sandbox Code Playgroud)

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