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

时间:2016-12-01 14:50:08

标签: swift promisekit

如果我有一个函数返回一个promise并调用另一个也返回一个promise的函数,是否可以在不执行此操作的情况下进行转换...

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

func f2() -> Promise<Void> {

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

      ...
   }
}

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

1 个答案:

答案 0 :(得分:3)

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

你可能会认为Void在某种程度上是特殊的,就像它在神奇的编译方式中意味着“没有”一样。那不是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()