0Pricing
Swift Academy · Lezione

CustomDebugStringConvertible

Fornisci un output di debug più ricco.

CustomDebugStringConvertible è 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.

Una vista di debug separata

CustomDebugStringConvertible fornisce debugDescription, la rappresentazione utilizzata da debugPrint, dal comando po di LLDB e dal debugger. Può essere più dettagliata di description.

Aggiungere debugDescription

Renda il tipo conforme e fornisca la proprietà:

struct Point: CustomDebugStringConvertible {
    let x: Int
    let y: Int
    var debugDescription: String { "Point(x: \(x), y: \(y))" }
}
debugPrint(Point(x: 1, y: 2))  // Point(x: 1, y: 2)

debugPrint e print

print utilizza description; debugPrint utilizza debugDescription:

struct Money: CustomStringConvertible, CustomDebugStringConvertible {
    let cents: Int
    var description: String { "$\(Double(cents)/100)" }
    var debugDescription: String { "Money(cents: \(cents))" }
}
let m = Money(cents: 250)
print(m)       // $2.5
debugPrint(m)  // Money(cents: 250)

Quando fornirle entrambe

Utilizzi description per un output pulito destinato agli utenti e debugDescription per i dettagli diagnostici, come i valori grezzi e lo stato interno. Fornirle entrambe consente di ottenere il meglio in ogni contesto.

Più dettagli nel debug

Renda visibili gli elementi interni che gli utenti non dovrebbero vedere:

struct Session: CustomStringConvertible, CustomDebugStringConvertible {
    let user: String
    let token: String
    var description: String { "Session(\(user))" }
    var debugDescription: String { "Session(user: \(user), token: \(token))" }
}
let s = Session(user: "ann", token: "xyz")
print(s)       // Session(ann)
debugPrint(s)  // Session(user: ann, token: xyz)

Output di debug nelle collezioni

debugPrint di una collezione utilizza la debugDescription di ogni elemento:

struct Tag: CustomDebugStringConvertible {
    let name: String
    var debugDescription: String { "Tag(\(name))" }
}
debugPrint([Tag(name: "a"), Tag(name: "b")])  // [Tag(a), Tag(b)]

String(reflecting:)

Proprio come String(describing:) utilizza description, String(reflecting:) utilizza debugDescription:

struct Code: CustomDebugStringConvertible {
    let n: Int
    var debugDescription: String { "Code<\(n)>" }
}
print(String(reflecting: Code(n: 7)))  // Code<7>

Comportamento di fallback

Se un tipo fornisce solo description, debugPrint utilizza quest'ultima come fallback. Se fornisce solo debugDescription, il print normale utilizza comunque la forma predefinita del mirror:

struct Only: CustomStringConvertible {
    let v: Int
    var description: String { "Only(\(v))" }
}
debugPrint(Only(v: 3))  // Only(3)  -- falls back to description

Virgolette nell'output di debug

Noti che debugPrint di una String aggiunge le virgolette, riflettendo la sua natura di debug:

print("hi")        // hi
debugPrint("hi")   // "hi"

Diagnostica senza divulgare dati sensibili

Tenga i segreti fuori da description, ma li includa in debugDescription solo se i log sono sicuri. Scelga deliberatamente quali informazioni rendere visibili in ciascuna proprietà.

struct Key: CustomStringConvertible {
    let secret: String
    var description: String { "Key(***)" }
}
print(Key(secret: "abc"))  // Key(***)

Dettagli di debug per un'enumerazione

Le enumerazioni traggono vantaggio da una debugDescription che espone il case e il payload grezzi:

enum Load: CustomDebugStringConvertible {
    case idle
    case progress(Int)
    var debugDescription: String {
        switch self {
        case .idle: return "Load.idle"
        case .progress(let p): return "Load.progress(\(p))"
        }
    }
}
debugPrint(Load.progress(40))  // Load.progress(40)

Verifica rapida

Quale funzione utilizza debugDescription invece di description?

Riepilogo

Ha imparato a usare CustomDebugStringConvertible:

  • Fornisca var debugDescription: String per l'output diagnostico
  • Viene utilizzata da debugPrint, String(reflecting:) e dal debugger
  • print utilizza description; debugPrint utilizza debugDescription
  • Inserisca i dettagli interni aggiuntivi nel debug e il testo pulito in description

Successivo: la reflection con Mirror.

Domande Frequenti

La lezione «CustomDebugStringConvertible» è gratuita?

Sì — il testo completo di «CustomDebugStringConvertible» è 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 «CustomDebugStringConvertible»?

Fornisci un output di debug più ricco. 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 «CustomDebugStringConvertible»?

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. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. Reflection con Mirror
  4. Creazione di tipi adatti al debug
← Torna a Swift Academy