Что такое 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.