二进制运算符'<^>'不能应用于类型为

时间:2019-11-17 21:32:40

标签: ios swift xcode11.2 argo

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

  

二进制运算符'<^>'不能应用于类型'(())->的操作数   VoiceMailNumberResponse”和“已解码<_?>”

这是我的代码:

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"

此外,我使用 Argo Curry Runes 来解析JSON。

1 个答案:

答案 0 :(得分:1)

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

由于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:))
...

那是最好的判断方法:

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

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

  • 其他

您可能还想看看使用Xcode 9中引入的Swift's Decodable来解码JSON,以替代使用这些第三方程序包。

HTH