2016-04-20 7 views
0

Ich versuche, Daten aus JSON in eine sehr generische Struktur zu entschlüsseln unter Verwendung von Argo (https://github.com/thoughtbot/Argo):Versuch Arrays zu dekodieren mit 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") 
    } 
} 

Dies kompiliert. Ich weiß, dass es ValueBox nicht dekodieren könnte, wenn T ein Array ist. Aber das ist ein zweites Problem.

Wenn ich versuche jetzt Argo für die Decodierung zu verwenden:

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) 
} 

ich einen Compiler-Fehler, dass „Array<Int> nicht zu Protokoll‚Dekodierbare‘nicht entspricht“. Aber warum? Ich habe die Erweiterung zur Verfügung gestellt, um sie konform zu machen, oder fehlt mir etwas Offensichtliches?

Antwort

0

Für das zweite Beispiel, ich glaube, Sie <^> json <|| "value" statt <^> json <| "value"

verwenden müssen, wenn Sie ein Array von Wert verwenden Sie den Operator < verwenden müssen ||

a great link to the detailed Argo's documentation

+0

Wie gesagt, ist dieses Problem Nummer 2. Aber es ist schwierig, weil <|| würde zu [T] dekodieren und T ist bereits das Array. –

+0

Ja, aber Sie können das nicht tun. Sie müssen etwas Besonderes für ein Array tun. Weil, wenn Sie ValueBox > er versuchen, setzen Sie T als Array und der Compiler wollen [T] als Array . –

Verwandte Themen