2017-12-23 12 views
0

私はHealthKit対応アプリで前のバージョンのSwiftを使用して完了ハンドラを持っています。それは私にSwift 4.0の補完ハンドラの新バージョンに関する問題を与えている。私のコードは次のようになりタイプ '(成功:Bool、エラー:NSError?)の引数リストを使用して' completion 'を呼び出せません。

Cannot invoke 'completion' with an argument list of type '(success: Bool, error: NSError?)'

エラーを取得

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

これはどのように新しい完了ハンドラになりますか?私の頭の中でこれを包み込むのに苦労します。

+0

メソッドシグニチャーを使用する必要があります。なぜあなたは完了ハンドラをオプションとして宣言していますか?なぜあなたはNSErrorとしてエラーを投げかけますか?そのままエラーを返します(キャストやアンラッピングは不要です)。 'completion(success、error)'を返し、nilに対して補完をチェックしない –

答えて

0

completionOptionalではないため、(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以外に変更する必要があります。 errorNSErrorにキャストしないでください。タイプをErrorとしてください。

関連する問題