从一种承诺类型转换为另一种承诺类型

Convert from one promise type to another

如果我有一个 returns 承诺的函数并调用另一个同样 returns 承诺的函数,是否可以在不这样做的情况下在两者之间进行转换...

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

func f2() -> Promise<Void> {

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

      ...
   }
}

如果我没有 .then 调用,编译器无法从一种类型转换为另一种类型。

没有。首先,泛型在 Swift 中不是协变的。您无法在期望 [Any] 的地方传递 [String],因此您无法从 Promise<Void> 转换为 Promise<Any?>。在你的情况下更糟,因为你试图从 Promise<Any?> 转换为 Promise<Void>,而 Any? 不是 Void

您可能认为 Void 有点特别,就像它以一种神奇的编译器方式表示 "nothing"。那不是 Void 是什么。它只是空元组的类型别名 (())。您无法将 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().