web-dev-qa-db-ja.com

エラー:Swift + PromiseKitを使用して、タイプ '()->()'の値をクロージャ結果タイプ 'String'に変換できません

私はSwiftでのPromiseを初めて使用し、PromiseKitを使用してプレイグラウンドで非常に単純な応答を作成して使用しようとします。次のコードがあります。

_//: 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)
    }
}
_

ただし、次のエラーが発生します。

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

thenに渡すクロージャーがStringを返すと主張しているが、そのような値が返されないため、エラーがスローされます。そのクロージャーのどこかにStringを返す予定がない限り、次のようにクロージャーの戻り値の型をVoidに変更する必要があります。

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

戻り値の型がVoidのクロージャーは、戻り値の型を省略できることに注意してください。また、無関係な{あなたの質問のコード内(コンパイルされているため、これは実際のコードには存在しないと思います)。

その問題に加えて、Errorにはアクセス可能な初期化子がありません。コードで使用している初期化子は実際にはNSErrorに属しているため、reject呼び出しは次のようにする必要があります:

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