如果我有一个返回 promise 的函数并调用另一个也返回 promise 的函数,是否可以在不执行此操作的情况下在两者之间进行转换...
func f1() -> Promise<Any?> { ... }
func f2() -> Promise<Void> {
return f1().then { value -> Void in
...
}
}
如果我没有 .then
调用,编译器就无法从一种类型转换为另一种类型。
最佳答案
没有。首先,泛型在 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()
.
关于swift - 从一种 promise 类型转换为另一种 promise 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913614/