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:
description
Nieruchomość 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ć description
do swoich własnych klas, przyjmując protokół, CustomStringConvertible
a następnie implementując description
wł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"
description
jest również używany, gdy wywołujesz String
konstruktor:
let str = String(myobj) // str == "MyClass: 12"
Jest to zalecana metoda uzyskiwania dostępu do opisu instancji (w przeciwieństwie do metody, myobj.description
która nie zadziała, jeśli klasa nie jest zaimplementowana CustomStringConvertible
)
String(obj)
?
.debugDescription
wersja 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 CustomStringConvertible
byłaby wystarczająca.
NSObject
klasami rozszerzonymiJeśli Twoja klasa modelu jest rozszerzona z NSObject
, musisz zastąpić zmienną description
w 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 Country
klasie , w „Bibliotece CountryPicker iOS Swift” .
Lub, aby ułatwić zrozumienie, Twoja klasa i description
metoda 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 NSObject
niej, nie wymaga już, aby Twoja klasa była zgodna z CustomStringConvertible
klasą i nadpisujesz description
zmienną z NSObject
samej klasy. Zawsze pamiętaj, CustomStringConvertible
jest to głównie prosty sposób na osiągnięcie tego celu przez Swift.