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ść.
classMyClass: CustomStringConvertible{
var val = 17publicvar description: String { return"MyClass: \(val)" }
}
let myobj = MyClass()
myobj.val = 12print(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)
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.
Lub, aby ułatwić zrozumienie, Twoja klasa i descriptionmetoda powinny wyglądać następująco:
publicclassMyClass: NSObject{
publicvar memberAttribute = "I'm an attribute"publicoverridevar 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.
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ącdescription
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łujeszString
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 zaimplementowanaCustomStringConvertible
)źródło
String(obj)
?.debugDescription
wersja bardziej przyjazna dla programistówJeś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))
źródło
Powinieneś użyć
String(obj)
.Bezpośrednio z dokumentacji CustomStringConvertible :
źródło
description()
metodaCustomStringConvertible
byłaby wystarczająca.Jak to się robi z
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 zCustomStringConvertible
klasą i nadpisujeszdescription
zmienną zNSObject
samej klasy. Zawsze pamiętaj,CustomStringConvertible
jest to głównie prosty sposób na osiągnięcie tego celu przez Swift.źródło