5

promise を返す関数が 1 つあり、promise を返す別の関数を呼び出す場合、これを行わずに 2 つの間で変換することは可能ですか...

func f1() -> Promise<Any?> { ... }

func f2() -> Promise<Void> {

   return f1().then { value -> Void in

      ...
   }
}

呼び出しがない場合.then、コンパイラはある型から別の型に変換できません。

4

1 に答える 1

6

いいえ。まず、ジェネリックは Swift では共変ではありません。[String]を期待する場所にa を渡すことはできないため、 からに[Any]変換することはできません。あなたの場合、 から に変換しようとしていて、 a は a ではないため、さらに悪いことです。Promise<Void>Promise<Any?>Promise<Any?>Promise<Void>Any?Void

Void魔法のようなコンパイラーの方法で「何もない」ことを意味するように、何か特別なものと考えているかもしれません。そうではありませんVoid。これは、空のタプル ( ) の typealias にすぎません()Any?からに変換することはできません()。それができるかどうか想像してみてください。次に、これを書くことができます:

var list: [Void] = [] // This is just as legal as Promise<Void>
f2().then { x: Void in
    list.append(x)
}

これで、ランダムな Optional を の配列に追加しました()。それはクラッシュし、コンパイラは私を救ってくれません。

もちろん、必要に応じて、次のようにヘルパーを作成することもできます。

extension Promise {
    func ignoringResult() -> Promise<Void> {
        return self.then { _ in }
    }
}

そして、次のように書くことができます:

func f2() -> Promise<Void> {
    return f1().ignoringResult()
}

PromiseKit には既にこのコンバーターがあります: Promise.asVoid().

于 2016-12-01T19:57:22.827 に答える