Comments (6)
If this is truely the response that you are trying to decode then it's not too hard. You actually only have one type in your array and it's an object of an item
and a collection
. I would make an in-between struct ItemCollection
say, and implement JSONDecodable
like so:
struct ItemCollection {
let item: Item
let collection: Collection
}
extension ItemCollection: JSONDecodable {
static func create(item: Item)(collection: Collection) -> ItemCollection {
return ItemCollection(item: item, collection: collection)
}
static func decode(j: JSONValue) -> ItemCollection {
return ItemCollection.create
<^> j <| "item"
<*> j <| "collection"
}
}
Then you can decode your array and use map
to get the separate arrays like so:
let results: [ItemCollection] = json <|| "result"
let items: [Item] = results.map { $0.item }
let collections: [Collection] = results.map { $0.collection }
where json
is the initial JSONValue
.
Or if you want them in the same array you can use reduce
let array: [SomeProtocol] = results.reduce([]) { $0 + [$1.item, $1.collection] }
from argo.
After reading @tonyd256 's answer, I realized that my approach was too Objective C like, so I ended up defining an enum with associated objects:
public enum ResultKind {
case ItemKind(Item)
case CollectionKind(Collection)
case UnknownKind
}
extension ResultKind : JSONDecodable {
static func create(item : Item?)(collection : Collection?) -> ResultKind {
if let item = item {
return ResultKind.ItemKind(item)
} else if let collection = collection {
return ResultKind.CollectionItem(collection)
} else {
return ResultKind.UnknownItem
}
}
public static func decode(j: JSON) -> ResultKind? {
let ItemKey = "item"
let CollectionKey = "collection"
return ResultKind.create
<^> j <|? ItemKey
<*> j <|? CollectionKey
}
}
Definitely a more Swift-y
way of doing things of doing things, I like it!
from argo.
What would be the type of the resulting array? You can't store structs of type Item
and Collection
in the same array, unless they implement the same protocol.
from argo.
That's exactly the case, they implement the same protocol (a domain-specific one, not just JSONDecodable
)
from argo.
Hmmm, this is were default implementations in protocols would really help in Swift :)
You could of course make it a class and subclass Item
and Collection
from that, but I guess you much rather have value types, right?
from argo.
This sound solid, let me try this out!
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 array failed HOT 5
- 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.