0Pricing
Swift Academy · Lezione

Strategie di decodifica per chiavi e date

Usi snake_case e le strategie per le date.

Strategie di decodifica per chiavi e date è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Panoramica delle strategie di decodifica

Invece di scrivere un'enum CodingKeys per ogni tipo, è possibile impostare una strategia globale sul decoder. Le strategie trasformano le chiavi e analizzano le date in modo uniforme per tutti i tipi decodificati.

import Foundation

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
print("Strategy configured")

convertFromSnakeCase

Impostando keyDecodingStrategy = .convertFromSnakeCase, le chiavi come first_name vengono convertite automaticamente nella proprietà camelCase firstName, senza bisogno di CodingKeys.

import Foundation

struct User: Codable {
    var firstName: String
    var lastName: String
}

let json = "{\"first_name\":\"Ada\",\"last_name\":\"Lovelace\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let u = try decoder.decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName, u.lastName)

Codifica in snake_case

L'encoder offre l'opzione corrispondente: keyEncodingStrategy = .convertToSnakeCase scrive le proprietà camelCase come chiavi JSON in snake_case.

import Foundation

struct User: Codable {
    var firstName: String
}

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let data = try encoder.encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)

La strategia si applica a tutte le chiavi

Una strategia per le chiavi si applica in modo uniforme a ogni proprietà di ogni tipo annidato. È la soluzione ideale quando un'intera API usa in modo coerente il formato snake_case.

import Foundation

struct Meta: Codable { var createdAt: String }
struct Doc: Codable { var docTitle: String; var docMeta: Meta }

let json = "{\"doc_title\":\"A\",\"doc_meta\":{\"created_at\":\"now\"}}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let d = try decoder.decode(Doc.self, from: json.data(using: .utf8)!)
print(d.docTitle, d.docMeta.createdAt)

Il problema delle date

JSON non dispone di un tipo per le date. I valori Date vengono codificati come numeri o stringhe e il decoder deve conoscerne il formato. dateDecodingStrategy gli indica come interpretarli.

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

print("Date needs a strategy to parse")

Decodifica delle date iso8601

dateDecodingStrategy = .iso8601 analizza timestamp ISO-8601 standard come 2020-01-01T00:00:00Z e li converte in valori Date.

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

let json = "{\"name\":\"Launch\",\"date\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

Codifica delle date iso8601

L'opzione corrispondente dell'encoder è dateEncodingStrategy = .iso8601, che scrive i valori Date come stringhe ISO-8601.

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

let e = Event(name: "Launch", date: Date(timeIntervalSince1970: 1577836800))
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let data = try encoder.encode(e)
print(String(data: data, encoding: .utf8)!)

Strategia secondsSince1970

Quando un'API invia timestamp Unix come numeri, usate .secondsSince1970 per interpretarli come secondi trascorsi dall'epoca Unix.

import Foundation

struct Event: Codable {
    var date: Date
}

let json = "{\"date\":1577836800}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

Formati di data personalizzati

Per i formati non standard, fornite un DateFormatter tramite .formatted(_:). In questo modo è possibile gestire date come 2020-01-01 prive della componente oraria.

import Foundation

struct Event: Codable { var date: Date }

let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
fmt.timeZone = TimeZone(identifier: "UTC")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(fmt)
let e = try decoder.decode(Event.self, from: "{\"date\":\"2020-01-01\"}".data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

Combinare le strategie

È possibile impostare insieme le strategie per le chiavi e per le date sullo stesso decoder, così da gestire un'API in snake_case e ISO-8601 senza codice ripetitivo specifico per ogni tipo.

import Foundation

struct LogEntry: Codable {
    var eventName: String
    var occurredAt: Date
}

let json = "{\"event_name\":\"login\",\"occurred_at\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .iso8601
let entry = try decoder.decode(LogEntry.self, from: json.data(using: .utf8)!)
print(entry.eventName, entry.occurredAt.timeIntervalSince1970)

Strategia e CodingKeys a confronto

Una strategia globale è concisa per le API uniformi. Quando solo alcune chiavi sono diverse o i nomi seguono regole irregolari, un'enum CodingKeys esplicita offre un controllo preciso su ogni chiave. È anche possibile combinarle.

import Foundation

struct Item: Codable {
    var itemName: String
}

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let i = try decoder.decode(Item.self, from: "{\"item_name\":\"Pen\"}".data(using: .utf8)!)
print(i.itemName)

Verifica rapida: strategie

Verificate la vostra comprensione delle strategie di decodifica.

Riepilogo: strategie per chiavi e date

Avete imparato a configurare globalmente i coder:

  • keyDecodingStrategy = .convertFromSnakeCase converte lo snake_case in camelCase; .convertToSnakeCase esegue la codifica nella direzione opposta.
  • dateDecodingStrategy = .iso8601 analizza i timestamp ISO; .secondsSince1970 e .formatted(_:) gestiscono gli altri formati.
  • Le strategie si applicano in modo uniforme a ogni tipo annidato.
  • Usate le strategie per le API uniformi e CodingKeys per quelle irregolari.

Domande Frequenti

La lezione «Strategie di decodifica per chiavi e date» è gratuita?

Sì — il testo completo di «Strategie di decodifica per chiavi e date» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Strategie di decodifica per chiavi e date»?

Usi snake_case e le strategie per le date. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Strategie di decodifica per chiavi e date»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. CodingKeys per rinominare
  2. Strategie di decodifica per chiavi e date
  3. encode(to:) e init(from:) manuali
  4. Decodifica di JSON eterogenei
← Torna a Swift Academy