我已将以下代码实现为与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。
最佳答案
注意:此答案仅基于您的代码示例,尚未经过测试。
由于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,以作为使用这些第三方程序包的替代方法。高温超导