2016-04-13 20 views
36

Qual è l'equivalente Swift di Java .toString() per stampare lo stato di un'istanza di classe?equivalente Swift di Java .toString()

+0

Maggiori info @ http://stackoverflow.com/questions/24068506/how-can- i-change-the-textual-representation-display-for-a-type-in-swift –

risposta

53

La proprietà description è ciò che stai cercando. Questa è la proprietà a cui si accede quando si stampa una variabile contenente un oggetto.

È possibile aggiungere description alle proprie classi adottando il protocollo CustomStringConvertible e quindi implementando la proprietà description.

class MyClass: CustomStringConvertible { 
    var val = 17 

    public var description: String { return "MyClass: \(val)" } 
} 

let myobj = MyClass() 
myobj.val = 12 
print(myobj) // "MyClass: 12" 

description viene utilizzato anche quando si chiama il costruttore di String:

let str = String(myobj) // str == "MyClass: 12" 

Questo è il metodo consigliato per l'accesso alla descrizione istanza (al contrario di myobj.description che non funziona se una classe non lo fa attuare CustomStringConvertible)

+0

Che dire di 'String (obj)'? – nielsbot

+0

C'è anche '.debugDescription' per una versione più adatta ai programmatori – nielsbot

+2

si applica alle strutture? – lmiguelvargasf

6

È necessario utilizzare String(obj).

diretta da the documentation for CustomStringConvertible:

NOTA

String (esempio) funziona per un'istanza di qualsiasi tipo, tornando sua descrizione se l'istanza sembra essere CustomStringConvertible. L'utilizzo di CustomStringConvertible come un vincolo generico o l'accesso diretto a una descrizione del tipo conforme a , è pertanto sconsigliato.

+0

Sembra che il metodo 'description()' di 'CustomStringConvertible' sia sufficiente. –

4

Se è possibile utilizzare la struct anziché la classe, niente di più da fare.

struct stampa bene stesso per l'uscita

print("\(yourStructInstance)") 

o con classe come questa:

print(String(describing: yourClassInstance))