【问题标题】:Swift - Cannot specialize a non-generic definitionSwift - 无法专门化非泛型定义
【发布时间】:2017-01-10 09:27:57
【问题描述】:

我有一个函数负责在应用程序中发出 HTTP 请求。基本上,它设置了所有必需的标头、超时等……等等…… 然后,当请求完成时,我运行 2 个函数(由开发人员提供):whenSuccess/whenError(取决于调用的结果)和whenComplete(不管调用的结果)。我希望最后一个能够接收到whenSuccess 函数的结果。

我将doRequest 函数声明为

private func doRequest<S>(whenSuccess: (_ json: JSON?)->(S?),
                       whenError: (_ description: String)->(),
                       whenComplete: Optional<(S?)->()>) {
        // yada yada yada
}

因此,开发人员提供了一个获取JSON 并返回泛型的函数。如果调用whenError,则以nil为参数调用whenComplete

我正在调用它

doRequest<Int>(whenSuccess: { (json) -> (Int?) in //Cannot specialize a non-generic definition
            return 5
}, whenError: { (error) in

}) { (success) in

}

我收到错误评论:

不能专门化非泛型定义

知道这是否可以做到以及如何做到?

【问题讨论】:

    标签: swift generics swift3


    【解决方案1】:

    在 Swift 中,你不能明确地专门化泛型函数。相反,泛型函数会通过其参数的类型推断自动得到专门化。

    您尝试拨打的电话应如下所示:

    doRequest(whenSuccess: { json -> Int? in
        //...
    }, whenError: { error in
        //...
    }, whenComplete: { success in
        //...
    })
    

    【讨论】:

    • 换句话说,去掉“(json) -> (Int?) in”,因为编译器会自己解决。
    • 一点也不。将&lt;Int&gt; 放在其调用中的函数名之后。
    • 感谢@werediver,成功了!我习惯于冗长的语言,而快速使用它会遇到一些麻烦。为了完整起见,我邀请您用一段代码编辑您的答案:)
    • 但是为什么不能明确地专门化泛型函数呢?
    • @dented42 这是一个语言设计决定。泛型函数的显式特化有时会不那么冗长,但更神秘。在这种情况下,闭包的明确专业化为读者提供了更直接的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多