Быстрый эквивалент Java toString ()

Ответы:

122

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
7

Если можно использовать структуру вместо класса, то делать больше нечего.

struct просто отлично выводит себя на вывод

print("\(yourStructInstance)")

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

print(String(describing: yourClassInstance))
Андрей
источник
6

Вам следует использовать String(obj).

Прямо из документации для CustomStringConvertible :

НОТА

String (instance) будет работать для экземпляра любого типа, возвращая его описание, если это экземпляр 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» .

Или, чтобы вам было проще понять, ваш класс и descriptionметод должны выглядеть следующим образом:

public class MyClass: NSObject {
   public var memberAttribute = "I'm an attribute"

   public override var description: String {
       return "My Class member: \(self.memberAttribute)"
   }
}

Примечание. Поскольку вы расширяете свой модальный класс, от NSObjectнего больше не требуется, чтобы ваш класс соответствовал CustomStringConvertibleклассу, и вы переопределяете descriptionпеременную из самого NSObjectкласса. Всегда помните, что CustomStringConvertibleэто в основном чистый способ Swift.

Рандика Вишман
источник