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)
有人可以帮助我以正确的方式调用它吗?谢谢。
在 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?.