2016-04-20 61 views
0

我試圖從JSON數據解碼爲使用的Argo(https://github.com/thoughtbot/Argo)一個非常通用的結構進行解碼:試圖陣列,阿爾戈

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。但這是第二個問題。

如果我現在嘗試使用阿爾戈解碼:

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

對於第二個例子,我想,當您使用的值的Array必須使用運營商<必須使用<^> json <|| "value"代替<^> json <| "value"

||

a great link to the detailed Argo's documentation

+0

正如我所說的,這是問題編號2,但它是困難的,因爲<||會解碼爲[T],T已經是陣列。 –

+0

是的,但你不能那樣做。你必須爲數組做一些特殊的事情。因爲當你做ValueBox >他試圖把T作爲數組,並且編譯器想要[T]作爲數組。 –