Schnelles Äquivalent zu Java toString ()

Antworten:

120

Die descriptionImmobilie ist das, wonach Sie suchen. Auf diese Eigenschaft wird zugegriffen, wenn Sie eine Variable drucken, die ein Objekt enthält.

Sie können descriptionIhre eigenen Klassen erweitern, indem Sie das Protokoll übernehmen CustomStringConvertibleund dann die descriptionEigenschaft implementieren .

class MyClass: CustomStringConvertible {
    var val = 17

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

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

descriptionwird auch verwendet, wenn Sie den StringKonstruktor aufrufen :

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

Dies ist die empfohlene Methode für den Zugriff auf die Instanzbeschreibung (im Gegensatz dazu myobj.descriptionfunktioniert sie nicht, wenn eine Klasse nicht implementiert wird CustomStringConvertible).

vacawama
quelle
Was ist mit String(obj)?
Nielsbot
Es gibt auch .debugDescriptionfür eine programmiererfreundlichere Version
Nielsbot
2
gilt es für Strukturen?
lmiguelvargasf
1
Ja, CustomStringConvertible ersetzt Printable. @ Antonio, ich erinnere mich nicht, wann es sich geändert hat, aber es war sicherlich lange vor Swift 3.
vacawama
1
Die MyClass muss von NSObject
DàChún
7

Wenn es möglich ist, die Struktur anstelle der Klasse zu verwenden, ist nichts weiter zu tun.

struct druckt sich nur gut auf die Ausgabe

print("\(yourStructInstance)")

oder mit Klasse wie dieser:

print(String(describing: yourClassInstance))
Andrey
quelle
6

Du solltest benutzen String(obj) .

Direkt aus der Dokumentation zu CustomStringConvertible :

HINWEIS

String (Instanz) funktioniert für eine Instanz eines beliebigen Typs und gibt ihre Beschreibung zurück, wenn die Instanz zufällig CustomStringConvertible ist. Es wird daher davon abgeraten, CustomStringConvertible als generische Einschränkung zu verwenden oder direkt auf die Beschreibung eines konformen Typs zuzugreifen.

Ewan Mellor
quelle
Scheint, als wäre die description()Methode CustomStringConvertibleausreichend.
Greg Brown
5

Wie es gemacht wird NSObject erweiterten Klassen gemacht wird

Wenn Ihre Modellklasse von erweitert wird NSObject, müssen Sie die Variable descriptionwie folgt überschreiben :

public override var description: String {
    return "\n{\n index: \(self.index),\n"
        + " country: \(self.name),\n"
        + " isoCountryCode: \(self.isoCountryCode),\n"
        + " localeId: \(self.localeId),\n"
        + " flagImageName: \(self.flagImageName!)\n}"
}

Sie können hier in der CountryKlasse in der "CountryPicker iOS Swift-Bibliothek" überprüfen, wie ich es gemacht habe .

Oder , um es einfacher für Sie zu verstehen, Ihre Klasse und descriptionMethode wie folgt aussehen:

public class MyClass: NSObject {
   public var memberAttribute = "I'm an attribute"

   public override var description: String {
       return "My Class member: \(self.memberAttribute)"
   }
}

Hinweis: Da Sie Ihre Modal-Klasse erweitern, muss Ihre Klasse NSObjectnicht CustomStringConvertiblemehr mit der Klasse descriptionübereinstimmen , und Sie überschreiben die Variable aus der NSObjectKlasse selbst. Denken Sie immer daran, CustomStringConvertibleist meistens der reine Swift-Weg, um dies zu erreichen.

Randika Vishman
quelle