swift - 从一种 promise 类型转换为另一种 promise 类型

标签 swift promisekit

如果我有一个返回 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/

相关文章:

ios - 从 Swift 函数中的异步调用返回数据

ios Promise 6 - 无法将类型 '(_) -> Environment' 的值转换为预期的参数类型 '(_) -> _'

swift - 使用 PromiseKit 和 Alamofire 时跟踪进度

swift 4 : Cannot assign value of type '(Void) -> Void' to type '(() -> Void)?'

ios - 如何在 PromiseKit 6 中使用循环?

ios - Swift : 'case .success(let dict):' 是什么意思

swift - "CGFloat is not convertible to Int"尝试计算表达式时

swift - 使用可信服务器验证 IAP 收据。如果返回的 JSON 不包含 "latest_receipt_info" key ,如何确定试用资格?

ios - 无需委托(delegate)即可获取 UITextView 文本

iOS - 创建核心图像过滤器循环时保留原始图像