Szybki odpowiednik Java toString ()

Odpowiedzi:

122

descriptionNieruchomość jest to, czego szukasz. Jest to właściwość, do której uzyskuje się dostęp podczas drukowania zmiennej zawierającej obiekt.

Możesz dodać descriptiondo swoich własnych klas, przyjmując protokół, CustomStringConvertiblea następnie implementując descriptionwłaściwość.

class MyClass: CustomStringConvertible {
    var val = 17

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

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

descriptionjest również używany, gdy wywołujesz Stringkonstruktor:

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

Jest to zalecana metoda uzyskiwania dostępu do opisu instancji (w przeciwieństwie do metody, myobj.descriptionktóra nie zadziała, jeśli klasa nie jest zaimplementowana CustomStringConvertible)

vacawama
źródło
O co chodzi String(obj)?
nielsbot
Jest też .debugDescriptionwersja bardziej przyjazna dla programistów
nielsbot
2
czy to dotyczy konstrukcji?
lmiguelvargasf
1
Tak, CustomStringConvertible zastąpiony Printable. @Antonio, nie pamiętam, kiedy to się zmieniło, ale z pewnością było to na długo przed Swift 3.
vacawama
1
MyClass musi zostać przedłużony z NSObject
DàChún
7

Jeśli możliwe jest użycie struktury zamiast klasy, to nic dodatkowego do zrobienia.

struct po prostu drukuje dobrze na wyjściu

print("\(yourStructInstance)")

lub z taką klasą:

print(String(describing: yourClassInstance))
Andrzej
źródło
6

Powinieneś użyć String(obj).

Bezpośrednio z dokumentacji CustomStringConvertible :

UWAGA

Ciąg (instancja) będzie działać dla instancji dowolnego typu, zwracając jej opis, jeśli instancja jest CustomStringConvertible. Dlatego odradza się używanie CustomStringConvertible jako ograniczenia ogólnego lub bezpośredniego uzyskiwania dostępu do opisu typu zgodnego.

Ewan Mellor
źródło
Wydaje się, że description()metoda CustomStringConvertiblebyłaby wystarczająca.
Greg Brown
5

Jak to się robi z NSObjectklasami rozszerzonymi

Jeśli Twoja klasa modelu jest rozszerzona z NSObject, musisz zastąpić zmienną descriptionw następujący sposób:

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}"
}

Możesz sprawdzić, jak to zrobiłem, tutaj w Countryklasie , w „Bibliotece CountryPicker iOS Swift” .

Lub, aby ułatwić zrozumienie, Twoja klasa i descriptionmetoda powinny wyglądać następująco:

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

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

Uwaga: Ponieważ rozszerzasz swoją klasę Modal z NSObjectniej, nie wymaga już, aby Twoja klasa była zgodna z CustomStringConvertibleklasą i nadpisujesz descriptionzmienną z NSObjectsamej klasy. Zawsze pamiętaj, CustomStringConvertiblejest to głównie prosty sposób na osiągnięcie tego celu przez Swift.

Randika Vishman
źródło