Das ist in diesem Fall nicht möglich - der Completion-Handler müsste mit throws
deklariert werden (und die Methode mit rethrows
) und dieser nicht.
Beachten Sie, dass all das Werfen nur eine andere Notation für NSError **
in Objective-C (inout error parameter) ist. Der Objective-C-Callback hat keinen Inout-Parameter, daher gibt es keine Möglichkeit, den Fehler weiterzugeben.
Sie müssen eine andere Methode verwenden, um Fehler zu behandeln.
Im Allgemeinen funktionieren NSError **
in Obj-C oder throws
in Swift nicht gut mit asynchronen Methoden, da die Fehlerbehandlung synchron funktioniert.
Wenn Sie eine Schließung definieren, die Folgendes auslöst:
%Vor% Dann ist der Typ dieses Abschlusses () throws -> ()
und die Funktion, die diesen Abschluss als Parameter verwendet, muss denselben Parametertyp haben:
Mit dieser Funktion können Sie completion
closure synchron aufrufen:
und Sie müssen throws
keyword zur Funktionssignatur oder Aufrufvervollständigung mit try!
hinzufügen:
oder asynchron:
%Vor%Im letzten Fall können Sie keinen Fehler erkennen.
Wenn also completion
closure in eventStore.requestAccessToEntityType
method ist und die Methode selbst nicht throws
in ihrer Signatur hat oder wenn completion
asynchron aufgerufen wird, dann kann% code_% nicht von dieser Closure kommen.
Ich schlage Ihnen die folgende Implementierung Ihrer Funktion vor, die den Fehler an den Rückruf übergibt, anstatt ihn zu werfen:
%Vor% Sie können keine Funktion mit throw
erstellen, aber eine closure
mit Status oder Fehler zurückgeben!
Wenn es nicht klar ist, kann ich etwas Code geben.
requestAccessToEntityType
arbeitet asynchron. Wenn der Beendigungshandler schließlich ausgeführt wird, ist Ihre Funktion bereits zurückgegeben. Daher ist es nicht möglich, einen Fehler aus der Schließung zu werfen, wie Sie es vorschlagen.
Sie sollten den Code wahrscheinlich so umgestalten, dass der Autorisierungsteil getrennt von der Ereigniseinfügung behandelt wird und nur insertEventToDefaultCalendar
aufgerufen wird, wenn Sie wissen, dass der Autorisierungsstatus wie erwartet / erforderlich ist.
Wenn Sie wirklich alles in einer Funktion behandeln möchten, könnten Sie einen Semaphor (oder eine ähnliche Technik) verwenden, damit sich der asynchrone Codeteil synchron in Bezug auf Ihre Funktion verhält.
%Vor%