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