【问题标题】:Migrating from PromiseKit wrap从 PromiseKit 包装迁移
【发布时间】:2018-12-16 16:28:17
【问题描述】:

我正在尝试摆脱代码中的一些警告,并且似乎无法从 PromiseKit 的 wrap 迁移出去。具体来说,在 6.0 版本中,我不应该使用它,而应该使用 init(resolver:)

我有一个函数:

func foo(arg1: Int, arg2: Int, completionHandler: @escaping () -> ())

以下工作正常:

wrap({ foo(arg1: val1, arg2: val2, completionHandler: $0) })

我尝试将其更改为(发行说明建议的内容):

Promise { foo(arg1: val1, arg2: val2, completionHandler: $0.resolve) }

这产生了一个错误Generic parameter 'T' could not be inferred,所以我尝试修复它:

Promise<Void> { foo(arg1: val1, arg2: val2, completionHandler: $0.resolve) }

但这引发了另一个错误Unable to infer closure type in the current context,我不确定从那里去哪里。

【问题讨论】:

    标签: ios swift promisekit


    【解决方案1】:

    下面是用于wrap 方法的deprecated 方法。

    @available(*, deprecated, message: "See `init(resolver:)`")
    public func wrap(_ body: (@escaping (Error?) -> Void) throws -> Void) -> Promise<Void> {
        return Promise { seal in
            try body(seal.resolve)
        }
    }
    

    正如我们所见,completion 闭包采用了Optional Error 参数,所以我怀疑您的旧代码通过错误的闭包是如何工作的。我感觉你的foo方法声明应该是这样的,

    func foo(arg1: Int, arg2: Int, completionHandler: @escaping (Error?) -> Void) {
        // body
    }
    

    但是对于最新的PromiseKit,您可以通过传递Optional Error 来更新completionHandler,如下所示创建Promises

    Promise { foo(arg1: 1, arg2: 2, completionHandler: $0.resolve) }
    

    【讨论】:

    • 谢谢,确实指出了问题!我的completionHandler@escaping () -&gt; (),在更改为(Error?) -&gt; Void 后它起作用了。不知何故,这确实是用 wrap 构建的,但不是用 init 构建的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2014-11-22
    相关资源
    最近更新 更多