我正在尝试使用Argo(https://github.com/thoughtbot/Argo)将数据从JSON解码为非常通用的结构:
struct ValueBox<T: Decodable where T == T.DecodedType> {
let value: T
}
extension ValueBox: Decodable {
static func decode(json: JSON) -> Decoded<ValueBox> {
let r = curry(ValueBox.init)
<^> json <| "value"
return r
}
}
extension Array: Decodable {
public typealias DecodedType = Array<Element>
}
extension Array {
public static func decode(json: JSON) -> Decoded<Array<Element>> {
return Decoded<Array>.customError("not implemented")
}
}
这个编译。我知道如果T是一个数组,它将无法解码ValueBox。但这是第二个问题。
如果我现在尝试使用Argo进行解码:
func testExample() {
let jsonDict_Int: [String : AnyObject] = [
"value" : 5
]
let jsonDict_IntArray: [String : AnyObject] = [
"value" : [5]
]
let intBox: Decoded<ValueBox<Int>> = decode(jsonDict_Int)
let intArrayBox: Decoded<ValueBox<Array<Int>>> = decode(jsonDict_IntArray)
}
我收到编译错误,“Array<Int>
不符合协议'可解码'”。但为什么?我提供了扩展以使其符合,或者我错过了一些明显的东西?
答案 0 :(得分:0)
对于第二个示例,我认为您必须使用<^> json <|| "value"
而不是<^> json <| "value"
使用值数组时,必须使用运算符&lt; ||