首页 > 解决方案 > 二元运算符“<^>”不能应用于类型的操作数

问题描述

我已经实现了以下代码以与Argo框架一起使用,一直到Xcode 11.2.1更新为止。当我更新我的 Xcode 版本时,出现以下错误:

二元运算符“<^>”不能应用于“(()) -> VoiceMailNumberResponse”和“Decoded<_?>”类型的操作数

这是我的代码:

struct VoiceMailNumberResponse{
    var name: String?
    var value: String?
}

extension VoiceMailNumberResponse: Argo.Decodable {
    static func decode(_ json: JSON) -> Decoded<VoiceMailNumberResponse> {
        let voiceMailNumberResponse = curry(VoiceMailNumberResponse.init)
        return voiceMailNumberResponse
            <^> json <|?  "name"
            <*> json <|?  "value"
    }
}

线上出现错误:"<^> json <|? "name"

此外,我使用ArgoCurryRunes来解析 JSON。

标签: iosswiftxcode11.2argo

解决方案


注意:此答案仅基于您的代码示例,尚未经过测试。

由于 的两个属性VoiceMailNumberResponse都是可选的,因此 Xcode 10.1/Swift 4.2(测试的版本)产生两种init方法:

init()
init(name: String?, value: String?)

如果两者都不是或只有一个属性是可选的,则仅生成第二个init。从问题看来,Xcode 11.2.1/Swift 5.1 的行为方式相同。

错误消息中的类型:

(()) -> VoiceMailNumberResponse

表示编译器已选择init()传递给curry,而代码期望init(name: String?, value: String?)传递 。

由于代码显然可以与以前的一些 Xcode/Swift 一起使用,这似乎是行为上的改变。

这可能是对语言和/或编译器的更改或“功能”。您可以init通过包含参数名称来明确指定使用哪个来解决它,例如:

...
let voiceMailNumberResponse = curry(VoiceMailNumberResponse.init(name:value:))
...

也就是说,最好弄清楚是否:

  • 这是语言/编译器更改,因此ArgoCurryRunes可能需要更新,您应该报告(版本历史表明之前已经解决了歧义);

  • “功能”,在这种情况下,您应该前往 feedbackassistant.apple.com 并提交错误报告;或者

  • 别的东西

您可能还想查看使用Xcode 9 中引入的SwiftDecodable解码 JSON 作为使用这些第三方包的替代方法。

高温高压


推荐阅读