Listando Amiibos com Swift

Listando Amiibos com Swift (Quase sem codificar)

Neste projeto a ideia será consumir uma API simples e pública, de uma maneira rápida e com pouco código.

Vamos conectar pelo Postman, gerar e exportar o código de conexão, com o response vamos mapear para um Objeto que irá nos ajudar no Swift.

No Quicktype colocamos a request e copiamos o código que ele gerou, para mapear os campos.

Por fim no Playground vamos colar ambos código e testar, com uma pequena alteração, para demonstrar como listar os dados da API, e prevenir erros lançando eles no catch.

Links:
Para Mapear o Objeto: https://app.quicktype.io/
Postman: https://www.postman.com/downloads/

Chamando a API no POSTMAN
https://www.amiiboapi.com/api/amiibo/?name=mario
Exportando o código do Postman para Swift – URLSession.
QuickType Mapeando os campos do JSON que retornou na API.
Tratando as chaves com underline.
Criando um novo Playground.
Resultado final no Playground, listando os dados.
/*
 ####### QUICKTYPE CODE #######
*/
// MARK: - Amiibo
class Amiibo: Codable {
    let amiibo: [AmiiboElement]?

    init(amiibo: [AmiiboElement]?) {
        self.amiibo = amiibo
    }
}

// MARK: - AmiiboElement
class AmiiboElement: Codable {
    let amiiboSeries, character, gameSeries, head: String?
    let image: String?
    let name: String?
    let release: Release?
    let tail, type: String?

    init(amiiboSeries: String?, character: String?, gameSeries: String?, head: String?, image: String?, name: String?, release: Release?, tail: String?, type: String?) {
        self.amiiboSeries = amiiboSeries
        self.character = character
        self.gameSeries = gameSeries
        self.head = head
        self.image = image
        self.name = name
        self.release = release
        self.tail = tail
        self.type = type
    }
}

// MARK: - Release
class Release: Codable {
    let au, eu, jp, na: String?

    init(au: String?, eu: String?, jp: String?, na: String?) {
        self.au = au
        self.eu = eu
        self.jp = jp
        self.na = na
    }
}
/*
 ####### QUICKTYPE CODE #######
*/
do {
        let amiiboResponse = try JSONDecoder().decode(Amiibo.self, from: data)
        for amiibo in amiiboResponse.amiibo ?? [] {
            print("Amiibo \(amiibo.tail ?? "")" , " - " ,amiibo.amiiboSeries ?? "")
        }
    } catch {
        print("*************** Decodable error ***************")
        print(error)
        print(error.localizedDescription)
        print("*************** Decodable error ***************")
    }

/*
 ####### POSTMAN CODE #######
*/
import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

var semaphore = DispatchSemaphore (value: 0)

var request = URLRequest(url: URL(string: "https://www.amiiboapi.com/api/amiibo/?name=mario")!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"

let task = URLSession.shared.dataTask(with: request) { data, response, error in
  guard let data = data else {
    print(String(describing: error))
    semaphore.signal()
    return
  }
    //semaphore.signal()
    print("*************** RESPONSE ***************")
    print(String(data: data, encoding: .utf8)!)
    print("*************** RESPONSE ***************")
    do {
        let amiiboResponse = try JSONDecoder().decode(Amiibo.self, from: data)
        for amiibo in amiiboResponse.amiibo ?? [] {
            print("Amiibo \(amiibo.tail ?? "")" , " - " ,amiibo.amiiboSeries ?? "")
        }
    } catch {
        print("*************** Decodable error ***************")
        print(error)
        print(error.localizedDescription)
        print("*************** Decodable error ***************")
    }
  semaphore.signal()
}

task.resume()
semaphore.wait()
/*
 ####### POSTMAN CODE #######
*/

Related Posts

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *