Coder Social home page Coder Social logo

Comments (6)

tonyd256 avatar tonyd256 commented on May 24, 2024 1

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.

piercifani avatar piercifani commented on May 24, 2024 1

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.

nvh avatar nvh commented on May 24, 2024

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.

piercifani avatar piercifani commented on May 24, 2024

That's exactly the case, they implement the same protocol (a domain-specific one, not just JSONDecodable)

from argo.

nvh avatar nvh commented on May 24, 2024

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.

piercifani avatar piercifani commented on May 24, 2024

This sound solid, let me try this out!

from argo.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.