在Swift中,与Java的toString()
方法等效的是什么,用于打印类实例的状态?
在Swift中,与Java的toString()
方法等效的是什么,用于打印类实例的状态?
description
属性是你要寻找的内容。当你打印一个包含对象的变量时,就会访问该属性。
通过采用协议CustomStringConvertible
并实现description
属性,你可以将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
,它将无法正常工作)
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 library" 中。description
方法应该像下面这样:public class MyClass: NSObject {
public var memberAttribute = "I'm an attribute"
public override var description: String {
return "My Class member: \(self.memberAttribute)"
}
}
注意:由于您将Modal类从NSObject
扩展,因此不再需要您的类遵守CustomStringConvertible
类,并且您正在覆盖来自NSObject
类本身的description
变量。请记住,CustomStringConvertible
通常是实现此目的的纯Swift方式。
您应该使用String(obj)
。
注意
String(instance)
适用于任何类型的实例,如果实例恰好是CustomStringConvertible,则返回其描述。因此,不建议将CustomStringConvertible用作通用约束,或直接访问符合类型的描述。
CustomStringConvertible
的 description()
方法就足够了。 - Greg Brown