promise を返す関数が 1 つあり、promise を返す別の関数を呼び出す場合、これを行わずに 2 つの間で変換することは可能ですか...
func f1() -> Promise<Any?> { ... }
func f2() -> Promise<Void> {
return f1().then { value -> Void in
...
}
}
呼び出しがない場合.then
、コンパイラはある型から別の型に変換できません。
promise を返す関数が 1 つあり、promise を返す別の関数を呼び出す場合、これを行わずに 2 つの間で変換することは可能ですか...
func f1() -> Promise<Any?> { ... }
func f2() -> Promise<Void> {
return f1().then { value -> Void in
...
}
}
呼び出しがない場合.then
、コンパイラはある型から別の型に変換できません。
いいえ。まず、ジェネリックは 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()
.