Comments (5)
I think you can do this without a custom decode function, actually. This is going to be so much easier with Swift 4.1 and conditional conformance, but the gist now is that you'll want to move from JSON
to [JSON]
then to [[Reference]]
:
extension Exercise: Argo.Decodable {
static func decode(_ json: JSON) -> Decoded<Exercise> {
let djs: Decoded<[JSON]> = json <|| "analyses"
let ans: Decoded<[[Reference]]> = djs.flatMap { js in
sequence(js.map([Reference].decode))
}
return curry(Exercise.init)
<^> .optional(ans)
}
}
This can be reduced to single expressions if you prefer. Alternatively, if you do this kind of thing frequently you can add a generic global function like so:
func decodeNested<T: Argo.Decodable>(_ json: JSON, key: String) -> Decoded<[[T]]> where T.DecodedType == T {
return (json <|| key)
>>- { sequence($0.map([T].decode)) }
}
extension Exercise: Argo.Decodable {
static func decode(_ json: JSON) -> Decoded<Exercise> {
let ans: Decoded<[[Reference]]> = decodeNested(json, key: "analyses")
return curry(Exercise.init)
<^> .optional(ans)
}
}
Once we implement conditional conformance this will simplify to what you have now:
extension Exercise: Argo.Decodable {
static func decode(_ json: JSON) -> Decoded<Exercise> {
return curry(Exercise.init)
<^> json <||? "analyses"
}
}
FWIW, I don't think you should need to explicitly make ReferenceType
conform to Decodable
either. I believe our default implementation should handle that if you just declare the conformance:
extension Exercise.ReferenceType: Argo.Decodable { }
from argo.
If would appreciate if you can take a look at this issue. :D
from argo.
Argo doesn't actually support decoding arrays of arrays by default. Perhaps with Swift 4.1's conditional conformances, but for now you'll need to do it manually and define a decode
method within an extension on Array
. Something like extension Array where Element == [Reference]
.
from argo.
@jshier Thanks for your reply.
extension Array where Element == [Exercise.Reference] {
func decode() -> Decoded<[Decoded<Exercise.Reference>]> {
var result: [Decoded<Exercise.Reference>] = []
self.forEach { inner in
let r = Exercise.Reference.decode(JSON(inner))
result.append(r)
}
return .success(result)
}
}
If I understand you correctly, I finally get this code, however, I don't know how to call this method on extension Exercise.Analyse: Argo.Decodable
extension Exercise.Analyse: Argo.Decodable {
static func decode(_ json: JSON) -> Decoded<Exercise.Analyse> {
// How?
}
}
Can you guide me a little bit more? Thanks
from argo.
Good news! This will Just Work in the next release! I'm going to close this now in anticipation of that release, but feel free to re-open this if you have any other questions.
from argo.
Related Issues (20)
- error: no such module 'Runes' HOT 7
- Problem with Decodable on xcode 9 HOT 3
- RFC: Renaming the Decodable protocol
- How to decode a "Dictionary" to "[Model]"? HOT 3
- Parse nested model fails when adding a specific key HOT 2
- How to decode dynamic keys HOT 2
- RFC: Renaming (or removing) the `<|` family of operators HOT 5
- Decode type 'Any' HOT 2
- RFC: Make Swift.Decodable conform to Argo.Decodable in Swift 4.1 HOT 4
- Convert all wrong type return JSON to specific type HOT 6
- Decoding the same object with different keys HOT 6
- How to parse an empty dictionary object in Argo HOT 1
- [Question] Array decoding HOT 4
- Using pure can't compile using Swift 3 HOT 2
- Decodable' is ambiguous for type lookup in this context (Swift4) HOT 1
- Parsing a json array with strings and objects intermixed HOT 2
- Xcode 11.0 compatibility issue HOT 3
- Xcode 11.2.1 Binary operator '<^>' cannot be applied to operands of type HOT 7
- Upgrade to version 5.0.0 blocked due to Ogra library HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from argo.