Швидкий еквівалент Java toString ()


Відповіді:


123

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)?
nielsbot

Існує також .debugDescriptionбільш зручна для програмістів версія
nielsbot

2
це стосується конструкцій?
lmiguelvargasf

1
Так, CustomStringConvertible замінив Printable. @Antonio, я не пам'ятаю, коли це змінилося, але це, звичайно, було задовго до Swift 3.
vacawama,

1
MyClass повинен бути розширений з NSObject
DàChún

7

Якщо є можливість використовувати структуру замість класу, тоді нічого додаткового робити.

struct просто друкує себе на вихід

print("\(yourStructInstance)")

або з таким класом:

print(String(describing: yourClassInstance))

6

Ви повинні використовувати String(obj).

Безпосередньо з документації для CustomStringConvertible :

ПРИМІТКА

Рядок (екземпляр) буде працювати для екземпляра будь-якого типу, повертаючи його опис, якщо екземпляр є CustomStringConvertible. Тому не рекомендується використовувати CustomStringConvertible як загальне обмеження або отримувати безпосередній доступ до опису відповідного типу.


Здається, description()методу CustomStringConvertibleбуде достатньо.
Грег Браун

5

Як це робиться з 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в основному це чистий швидкий спосіб досягнення цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.