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 descriptionVirgolette 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: Stringper l'output diagnostico - Viene utilizzata da
debugPrint,String(reflecting:)e dal debugger printutilizzadescription;debugPrintutilizzadebugDescription- 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
- CustomStringConvertible
- CustomDebugStringConvertible
- Reflection con Mirror
- Creazione di tipi adatti al debug