2015-06-19 16 views
8

Ich versuche, PromiseKit mit Swift zu verwenden. Ich bin nicht wirklich damit vertraut, und es scheint nicht viel Information über seine Verwendung mit Swift zu geben.PromiseKit mit Swift: Kette von Versprechen zu beenden

Ich kann nicht herausfinden, wie man eine Kette von Versprechen beendet. Solange der letzten (Terminal) then Block eine einzige Anweisung enthält, ist alles in Ordnung:

firstly { 
    // ... 
}.then { obj in 
    self.handleResult(obj) 
}.catch { error in 
    self.handleError(error) 
} 

Allerdings, wenn ich versuche, eine andere Erklärung hinzuzufügen, Compiler beschwert:

firstly { 
    // ... 
}.then { obj in 
    self.handleResult(obj) 
    self.doSomethingDifferent(obj) 
}.catch { error in // compiler error: Missing return in a closure expected to return 'AnyPromise' 
    self.handleError(error) 
} 

Offensichtlich ist die Lösung ist ein anderes Versprechen, aber es macht keinen Sinn in der Klemmleiste. Kann ich noch etwas tun?

Antwort

18

http://promisekit.org/PromiseKit-2.0-Released/ Nach unter Swift Compiler Probleme Abschnitt:

Der Swift-Compiler wird oft Fehler mit dann. Um herauszufinden, die Problem, versuchen Sie zunächst die vollständige Signatur für Ihre Verschlüsse Angabe:

foo.then { x in 
    doh() 
    return bar() 
} 

// will need to be written as: 

foo.then { obj -> Promise<Type> in 
    doh() 
    return bar() 
} 

// Because the Swift compiler cannot infer closure types very 
// well yet. We hope this will be fixed. 

// Watch out for one-line closures though! Swift will 
// automatically infer the types, which may confuse you: 

foo.then { 
    return bar() 
} 

So werden Sie den Code ändern müssen:

firstly { 
    // ... 
}.then { obj -> Promise<WhateverTypeDoSomethingDifferentPromises> in 
    self.handleResult(obj) 
    self.doSomethingDifferent(obj) 
}.catch { error in 
    self.handleError(error) 
} 

Oder Sie verwenden obj -> Void zu stoppen die Kette

+3

_Oder kannst du 'obj -> Void' verwenden, um die Kette zu stoppen_ - ja, genau das habe ich gebraucht. Vielen Dank. –

4

ändern sie es an:

firstly { 
    // ... 
}.then { obj -> Void in 
    self.handleResult(obj) 
    self.doSomethingDifferent(obj) 
}.catch { error in 
    self.handleError(error) 
} 
+0

danke für deine antwort, aber wie unterscheidet es sich von der akzeptierten? –

+0

akzeptiert man arbeitet nicht, es gibt keine Rückkehr. du wolltest auch eine Leere, kein Versprechen –

Verwandte Themen