Come posso modificare la rappresentazione testuale visualizzata per un tipo in Swift?

Come posso modificare l’output testuale che viene visualizzato nell’interpolazione stringa?

Il protocollo Printable sembra il più ovvio, ma viene ignorato in entrambe le interpolazioni stringa e quando si stampa l’istanza, ad esempio:

 struct Point : Printable { var x = 0 var y = 0 var description : String { return "(\(x), \(y))" } func toString() -> String { return description } } 

Allo stesso modo la convenzione toString() non ha alcun effetto:

 var p = Point(x: 10, y: 20) println(p) // V11lldb_expr_05Point (has 2 children) println("\(p)") // V11lldb_expr_05Point (has 2 children) println(p.description) // (10, 20) println("\(p.description)") // (10, 20) 

Il comportamento è ancora diverso in PlayGround che utilizza la propria rappresentazione String per le strutture, ovvero:

 p // {x 10, y 20} 

C’è un modo per cambiare il modo in cui viene visualizzata un’istanza?

Swift 2 – 4

Sommario

Conformarsi al protocollo CustomStringConvertible e aggiungere description :

 var description: String { return "description here" } 

Esempio

Puoi creare alcune strutture:

 struct Animal : CustomStringConvertible { let type : String var description: String { return type } } struct Farm : CustomStringConvertible { let name : String let animals : [Animal] var description: String { return "\(name) is a \(self.dynamicType) with \(animals.count) animal(s)." } } 

Se li inizializzi:

 let oldMajor = Animal(type: "Pig") let boxer = Animal(type: "Horse") let muriel = Animal(type: "Goat") let orwellsFarm = Farm(name: "Animal Farm", animals: [oldMajor, boxer, muriel]) 

Le descrizioni personalizzate appariranno nel tuo parco giochi:

inserisci la descrizione dell'immagine qui

Vedi anche CustomDebugStringConvertible , che puoi usare per un output più dettagliato durante il debug.


Nota d’uso

È ansible inizializzare una String da qualsiasi tipo senza implementare questo protocollo. Per esempio:

inserisci la descrizione dell'immagine qui

Per questo motivo, i documenti dicono:

CustomStringConvertible utilizzare CustomStringConvertible come un vincolo generico o accedere direttamente alla description di un tipo conforms è scoraggiato.

Rilevante Apple Swift Docs

Apple fornisce questo esempio:

 struct MyType: Printable { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled" 

Se provi questo nel parco giochi, avrai lo stesso problema che stai ricevendo ( V11lldb_expr... ). Nel parco giochi, si ottiene la descrizione sul lato destro quando si chiama l’inizializzatore, ma il println non restituisce qualcosa di leggibile.

Fuori dal campo giochi, tuttavia, questo codice si comporta come ci si aspetterebbe. Sia il codice che il codice di esempio di Apple sopra riportano la description corretta quando vengono utilizzati in un contesto non di gioco.

Non penso che tu possa cambiare questo comportamento nei parchi giochi. Potrebbe anche essere solo un bug.

EDIT : Sono abbastanza sicuro che questo è un bug; Ho inviato una segnalazione di bug ad Apple.

AGGIORNAMENTO : in Swift 2, anziché in Printable , usa CustomStringConvertible ( link doc rilevante ).

 struct MyType: CustomStringConvertible { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled" 

Questo sembra essere un bug nel parco giochi. Se in realtà compili ed esegui normalmente il programma stampa:

 (10, 20) (10, 20) (10, 20) (10, 20) 

come previsto.

Dovresti segnalarlo a https://bugreport.apple.com

Se apri la vista della console: Visualizza -> Assistente Editor -> Mostra Assistente Editor puoi vedere le linee di stampa previste Controllato in xCode 6.3.2 con Yosimite 10.10

inserisci la descrizione dell'immagine qui