Jaki jest odpowiednik języka Java w języku Swift toString()do drukowania stanu instancji klasy?
Jaki jest odpowiednik języka Java w języku Swift toString()do drukowania stanu instancji klasy?
Odpowiedzi:
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)
String(obj)?
.debugDescriptionwersja bardziej przyjazna dla programistów
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.
description()metoda CustomStringConvertiblebyłaby wystarczająca.
NSObjectklasami rozszerzonymiJeś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.