无法使用类型'的参数列表调用'completion'(成功:Bool,错误:NSError?)'

时间:2017-12-23 21:17:58

标签: swift completionhandler

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

获取错误:

  

无法使用类型'的参数列表调用'completion'(成功:Bool,错误:NSError?)'

我的代码如下所示:

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

这应该如何看待新的完成处理程序?围绕这个问题缠绕很多麻烦。

1 个答案:

答案 0 :(得分:0)

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