尝试用Argo解码数组

时间:2016-04-20 14:08:10

标签: arrays json swift generics

我正在尝试使用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>不符合协议'可解码'”。但为什么?我提供了扩展以使其符合,或者我错过了一些明显的东西?

1 个答案:

答案 0 :(得分:0)

对于第二个示例,我认为您必须使用<^> json <|| "value"而不是<^> json <| "value"

  

使用值数组时,必须使用运算符&lt; ||

a great link to the detailed Argo's documentation