toString()打印类实例状态的 Swift 等价物是什么?
4 回答
该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"
descriptionString调用构造函数时也会用到:
let str = String(myobj) // str == "MyClass: 12"
这是访问实例描述的推荐方法(相反,myobj.description如果类未实现,则该方法不起作用CustomStringConvertible)
如果可以使用结构而不是类,那么无需做任何额外的事情。
struct 只是将自身打印到输出中
print("\(yourStructInstance)")
或者像这样的类:
print(String(describing: yourClassInstance))
你应该使用String(obj).
直接来自CustomStringConvertible 的文档:
笔记
String(instance) 将适用于任何类型的实例,如果该实例恰好是 CustomStringConvertible,则返回其描述。因此,不鼓励使用 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”的Country课堂上查看我是如何做到的。
或者,为了让您更容易理解,您的类和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类,并且您正在覆盖类本身description的变量。NSObject永远记住,CustomStringConvertible主要是纯 Swift 实现这一点的方式。