什么是Java toString()
的Swift等价物来打印类实例的状态?
答案 0 :(得分:89)
您正在寻找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
则无效}
答案 1 :(得分:7)
如果可以使用struct而不是class,那么就不用做了。
struct只是将其自身打印到输出
print("\(yourStructInstance)")
或像这样的类:
print(String(describing: yourClassInstance))
答案 2 :(得分:6)
您应该使用String(obj)
。
直接来自the documentation for CustomStringConvertible:
请注意
String(instance)适用于任何类型的实例,返回它 描述实例是否恰好是CustomStringConvertible。 使用CustomStringConvertible作为通用约束或访问 因此不鼓励直接符合类型的描述。
答案 3 :(得分:2)
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}"
}
您可以在here within the Country
class的"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)"
}
}
注意:
由于您是从NSObject
扩展Modal类,因此不再需要您的类遵守CustomStringConvertible
类,并且您将从description
类覆盖NSObject
变量本身。永远记住,CustomStringConvertible
主要是实现这一目标的纯粹Swift方式。