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

Что такое Swift эквивалент Java toString() напечатать состояние экземпляра класса?

4 ответа

Решение

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)

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

struct просто печатает нормально на выходе

print("\(yourStructInstance)")

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

print(String(describing: yourClassInstance))

Как это делается с 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 для достижения этой цели.

Вы должны использовать String(obj),

Непосредственно из документации для CustomStringConvertible:

НОТА

String (instance) будет работать для экземпляра любого типа, возвращая его описание, если экземпляр оказался CustomStringConvertible. Поэтому использование CustomStringConvertible в качестве общего ограничения или прямой доступ к описанию соответствующего типа не рекомендуется.

Другие вопросы по тегам