2017-07-01 4 views
1

私はSwiftの約束を新しくし、PromiseKitを使用して、それを使用しようとします。私は次のエラーを取得しかしエラー:Swift + PromiseKitを使用して '() - >()'型の値を 'String'型で閉じることはできません

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

:私は、次のコードを持っているあなたはthenに渡しているクロージャはStringを返すように主張しているので、

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

答えて

0

は、エラーがスローされますが、そのような値は返されません。あなたがどこかにそのクロージャ内Stringを返すことを計画していない限り、以下のように、あなたは、Voidにクロージャの戻り値の型を変更する必要があります。

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

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

Errorにはアクセス可能初期化子を、持っていない、あなたのコード内で使用している初期化子は、実際にNSErrorに属し、したがって、あなたのreject呼び出しが見えるように必要があります。答えを

reject(NSError(domain:"", code:1, userInfo:nil)) 
+0

感謝を。私は十分に約束を理解していないようだ。もしresponse - > Voidならば、fooは期待どおりに動作することを意味します - それで私は応答として "foo"にアクセスしますか? –

+0

はい。 ' - >'の後の型は、もし何かがあれば、クロージャから何が戻ってくるかだけを示します。 '応答 'は変更されません。 – aaplmath

+0

私は遊び場でammendmentsも試しましたが、 "foo"は表示されません。代わりに、右側に「Promise:UnsealedState」と書かれていますか? –

関連する問題