【发布时间】:2016-04-13 01:47:12
【问题描述】:
什么是 Swift 等效的 Java toString() 来打印类实例的状态?
【问题讨论】:
标签: ios swift string tostring customstringconvertible
什么是 Swift 等效的 Java toString() 来打印类实例的状态?
【问题讨论】:
标签: ios swift string tostring customstringconvertible
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,它将不起作用)
【讨论】:
String(obj) 呢?
如果可以使用结构体代替类,那么就没有什么可做的了。
struct 只是将自身打印到输出中
print("\(yourStructInstance)")
或者像这样的类:
print(String(describing: yourClassInstance))
【讨论】:
你应该使用String(obj)。
直接来自the documentation for 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}"
}
您可以在"CountryPicker iOS Swift library"here within the Country class 中查看我是如何做到的。
或者,为了让您更容易理解,您的类和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 类,并且您正在从 NSObject 类本身覆盖 description 变量。永远记住,CustomStringConvertible 主要是实现这一目标的纯 Swift 方式。
【讨论】: