5

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

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

func f2() -> Promise<Void> {

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

      ...
   }
}

如果我没有.then接听电话,编译器将无法从一种类型转换为另一种类型。

4

1 回答 1

6

不,首先,泛型在 Swift 中不是协变的。你不能[String]在你期望的地方传递 a [Any],所以你不能从转换Promise<Void>Promise<Any?>。在您的情况下,情况更糟,因为您正在尝试从 to 转换Promise<Any?>Promise<Void>而 aAny?不是 a Void

您可能会认为Void它有点特别,就像它以一种神奇的编译器方式表示“无”。事实并非如此Void。它只是空元组 ( ()) 的类型别名。您无法从 转换Any?()。想象一下,如果你能做到这一点。然后我可以这样写:

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

现在我在我的数组中添加了一些随机选项()。那会崩溃,编译器不会救我。

如果您愿意,您当然可以创建一个助手来执行此操作,例如:

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 回答