如果我有一个函数返回一个promise并调用另一个也返回一个promise的函数,是否可以在不执行此操作的情况下进行转换...
func f1() -> Promise<Any?> { ... }
func f2() -> Promise<Void> {
return f1().then { value -> Void in
...
}
}
如果我没有.then
调用,则编译器无法从一种类型转换为另一种类型。
答案 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()
。