it-swarm.com.de

Schnelles Äquivalent von Java toString ()

Was ist das Swift-Äquivalent von Java toString(), um den Status einer Klasseninstanz zu drucken?

57
Marcus Leon

Die description-Eigenschaft ist das, wonach Sie suchen. Auf diese Eigenschaft wird beim Drucken einer Variablen mit einem Objekt zugegriffen.

Sie können description zu Ihren eigenen Klassen hinzufügen, indem Sie das Protokoll CustomStringConvertible übernehmen und dann die description-Eigenschaft implementieren.

class MyClass: CustomStringConvertible {
    var val = 17

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

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

description wird auch verwendet, wenn Sie den Konstruktor String aufrufen:

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

Dies ist die empfohlene Methode für den Zugriff auf die Instanzbeschreibung (im Gegensatz zu myobj.description, das nicht funktioniert, wenn eine Klasse CustomStringConvertible nicht implementiert).

80
vacawama

Wenn es möglich ist, die struct anstelle von class zu verwenden, müssen Sie nichts weiter tun.

struct druckt einfach selbst fein aus

print("\(yourStructInstance)")

oder mit Klasse wie folgt:

print(String(describing: yourClassInstance))
6
Andrey

Sie sollten String(obj) verwenden.

Direkt aus der Dokumentation zu CustomStringConvertible :

HINWEIS

String (Instanz) funktioniert für eine Instanz eines beliebigen Typs und gibt dessen .__ zurück. Beschreibung, ob die Instanz CustomStringConvertible ..__ ist. Verwenden von CustomStringConvertible als generische Einschränkung oder Zugriff auf eine Die Beschreibung des übereinstimmenden Typs wird direkt empfohlen.

6
Ewan Mellor

Wie es mit NSObject erweiterten Klassen gemacht wird

Wenn Ihre Modellklasse von NSObject erweitert wurde, müssen Sie die Variable description wie 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 überprüfen, wie ich es gemacht habe hier in der Klasse Country , in der "CountryPicker iOS Swift library" .

Oder , um Ihnen das Verständnis zu erleichtern, sollten Ihre Klasse und Ihre description -Methode 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 von NSObject aus erweitern, muss Ihre Klasse nicht CustomStringConvertible erfüllen. ] Klasse nicht mehr, und Sie überschreiben die Variable description aus der Klasse NSObject. Denken Sie immer daran, CustomStringConvertible ist meistens der reine Swift) Weg, um dies zu erreichen.

2
Randika Vishman