Що таке Swift-еквівалент Java toString()
для друку стану екземпляра класу?
Що таке Swift-еквівалент Java toString()
для друку стану екземпляра класу?
Відповіді:
description
Властивість це те , що ви шукаєте. Це властивість, до якої можна отримати доступ при друку змінної, що містить об’єкт.
Ви можете додавати description
до власних класів, приймаючи протокол, CustomStringConvertible
а потім реалізовуючи description
властивість.
class MyClass: CustomStringConvertible {
var val = 17
public var description: String { return "MyClass: \(val)" }
}
let myobj = MyClass()
myobj.val = 12
print(myobj) // "MyClass: 12"
description
також використовується, коли ви викликаєте String
конструктор:
let str = String(myobj) // str == "MyClass: 12"
Це рекомендований метод доступу до опису екземпляра (на відміну від myobj.description
якого не буде працювати, якщо клас не реалізує CustomStringConvertible
)
String(obj)
?
.debugDescription
більш зручна для програмістів версія
Ви повинні використовувати String(obj)
.
Безпосередньо з документації для CustomStringConvertible :
ПРИМІТКА
Рядок (екземпляр) буде працювати для екземпляра будь-якого типу, повертаючи його опис, якщо екземпляр є CustomStringConvertible. Тому не рекомендується використовувати CustomStringConvertible як загальне обмеження або отримувати безпосередній доступ до опису відповідного типу.
description()
методу CustomStringConvertible
буде достатньо.
NSObject
розширеними класамиЯкщо ваш клас моделі розширено з NSObject
, вам слід замінити змінну description
наступним чином:
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}"
}
Ви можете перевірити, як я це зробив, тут, у Country
класі , у "CountryPicker iOS Swift library" .
Або, щоб вам було простіше зрозуміти, ваш клас і description
метод повинні виглядати наступним чином:
public class MyClass: NSObject {
public var memberAttribute = "I'm an attribute"
public override var description: String {
return "My Class member: \(self.memberAttribute)"
}
}
Примітка:
Оскільки ви розширюєте свій клас Modal, NSObject
він більше не вимагає, щоб ваш клас відповідав CustomStringConvertible
класу, і ви перевизначаєте description
змінну з самого NSObject
класу. Завжди пам’ятайте, CustomStringConvertible
в основному це чистий швидкий спосіб досягнення цього.