ios - 二元运算符“<^>”不能应用于类型的操作数
问题描述
我已经实现了以下代码以与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"
此外,我使用Argo、Curry和Runes来解析 JSON。
解决方案
注意:此答案仅基于您的代码示例,尚未经过测试。
由于 的两个属性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 中引入的SwiftDecodable
解码 JSON 作为使用这些第三方包的替代方法。
高温高压
推荐阅读
- r - 拟合大型加性模型时的进度条
- javascript - 合并和删除嵌套数组中的元素
- sql - 如何使 2 个远程表同步以及确定 Delta 记录
- java - Spring HATEOAS 中自定义媒体类型的最简单路径?
- mysql - 无法使用端口连接到 grafana
- c++ - 重新定义 void* 的句柄 ptr 以将 ptr 处理为 struct* (C/C++ mixcode) 以进行访问
- knexjs - 禁用 Knexjs 迁移?
- pdf - VBscript 将 Word 转换为 PDF 自定义字体
- openshift - 获取错误:获取 https://api-int.openshiftX.yyyy.com:22623/config/master
- html - 在 Scrabble GridTile 上禁用/启用随机奖励