web-dev-qa-db-fra.com

erreur: impossible de convertir la valeur de type '() -> ()' en type de résultat de fermeture 'String' à l'aide de Swift + PromiseKit

Je suis nouveau dans les promesses de Swift et j'utilise PromiseKit pour essayer de créer une réponse très simple dans une aire de jeux et tenter de l'utiliser. J'ai le code suivant:

//: Playground - noun: a place where people can play

import UIKit
import PromiseKit

func foo(_ error: Bool) -> Promise<String> {
    return Promise { fulfill, reject in
        if (!error) {
            fulfill("foo")
        } else {
            reject(Error(domain:"", code:1, userInfo:nil))
        }
    }
}

foo(true).then { response -> String in {
        print(response)
    }
}

Cependant, j'obtiens l'erreur suivante:

error: MyPlayground.playground:11:40: error: cannot convert value of type '() -> ()' to closure result type 'String' foo(true).then { response -> String in {

7
John Mike

L'erreur est levée car la fermeture que vous passez à then prétend renvoyer un String, mais aucune valeur de ce type n'est jamais retournée. Sauf si vous prévoyez de renvoyer un String quelque part dans cette fermeture, vous devez modifier le type de retour de la fermeture en Void, comme suit:

foo(true).then { response -> Void in
    print(response)
}

Notez que les fermetures avec le type de retour Void peuvent avoir leur type de retour omis. En outre, vous avez un { Superflu dans le code de votre question (je suppose que cela n'existe pas dans votre code réel, car il se compile).

En plus de ce problème, Error n'a pas d'initialiseurs accessibles - l'initialiseur que vous utilisez dans votre code appartient en fait à NSError, et donc votre appel reject doit ressembler à :

reject(NSError(domain:"", code:1, userInfo:nil))
2
aaplmath