Что такое 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 :
НОТА
String (instance) будет работать для экземпляра любого типа, возвращая его описание, если это экземпляр 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» .
Или, чтобы вам было проще понять, ваш класс и 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.