【问题标题】:Cannot invoke 'completion' with an argument list of type '(success: Bool, error: NSError?)'无法使用类型为“(成功:Bool,错误:NSError?)”的参数列表调用“完成”
【发布时间】:2017-12-24 06:02:04
【问题描述】:

我在一个启用了 HealthKit 的应用程序中使用了以前版本的 Swift 的完成处理程序。 Swift 4.0 中新版本的完成处理程序给我带来了问题。

得到错误:

无法使用类型为“(成功:Bool,错误:NSError?)”的参数列表调用“完成”

我的代码如下所示:

healthKitStore.requestAuthorization(toShare: nil, read: healthKitTypesToRead) { (success, error) -> Void in
    if( completion != nil ) {
        completion(success:success,error:error! as! NSError)
    }
}

使用新的完成处理程序应该如何?解决这个问题时遇到了很多麻烦。

【问题讨论】:

  • 应该你的方法签名。顺便说一句,您为什么将完成处理程序声明为可选?以及为什么将错误转换为 NSError。只需按原样返回错误(不需要强制转换或展开)。 completion(success, error) 并且不针对 nil 检查完成情况

标签: swift completionhandler


【解决方案1】:

completion不能是nil,因为它不是Optional,它的类型是(Bool,Error?)->Void,所以你的if语句是无效的。

这是检查您的授权请求是否成功的方法:

healthKitStore.requestAuthorization(toShare: nil, read: healthKitTypesToRead) { success, error in
    guard error == nil, success else {
        print(error);return
    }
    //You can start using HealthKit data
}

您似乎正在围绕HKHealthStore.requestAuthorization(toShare:read:completion) 实现自己的包装函数。问题似乎是您将自己的闭包输入参数命名为completion,这也是您要包装的函数的闭包参数的名称。您应该将自己的参数名称更改为 completion 以外的名称。您也不应该将error 转换为NSError,为什么不将类型保留为Error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多