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"
description
String
调用构造函数时也会用到:
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 实现这一点的方式。