Swift throw from closure in einer Funktion verschachtelt

9

Ich habe eine Funktion, die einen Fehler auslöst, in dieser Funktion habe ich eine inside a closure, die ich brauche, um den Fehler aus seinem Abschlusshandler zu werfen. Ist das möglich?

Hier ist mein Code soweit.

%Vor%     
shannoga 19.10.2015, 11:53
quelle

5 Antworten

6

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.

    
Sulthan 19.10.2015 12:07
quelle
4

Da das Werfen synchron ist, muss eine asynchrone Funktion, die werfen möchte, einen inneren Abschluss haben, der wie folgt lautet:

%Vor%

An der Aufrufseite verwenden Sie es dann wie folgt:

%Vor%     
nobre 13.06.2016 14:43
quelle
3

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:

%Vor%

Mit dieser Funktion können Sie completion closure synchron aufrufen:

%Vor%

und Sie müssen throws keyword zur Funktionssignatur oder Aufrufvervollständigung mit try! hinzufügen:

%Vor%

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%     
mixel 19.10.2015 12:20
quelle
0

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.

    
katleta3000 19.10.2015 12:08
quelle
0

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%     
iOSX 19.10.2015 13:31
quelle

Tags und Links