等效于 JavatoString()的 Swift

Swift 等效于 JavatoString()来打印类实例的状态是什么?

50456 次浏览

您正在寻找的是 description属性。这是在打印包含对象的变量时访问的属性。

You can add description to your own classes by adopting the protocol CustomStringConvertible and then implementing the description property.

class MyClass: CustomStringConvertible {
var val = 17


public var description: String { return "MyClass: \(val)" }
}


let myobj = MyClass()
myobj.val = 12
print(myobj)  // "MyClass: 12"

在调用 String构造函数时也使用 description:

let str = String(myobj)  // str == "MyClass: 12"

这是访问实例描述的推荐方法(与 myobj.description相反,如果类没有实现 CustomStringConvertiblemyobj.description将无法工作)

你应该使用 String(obj)

CustomStringConvertable 的文档直播:

注意

字符串(实例)将适用于任何类型的实例,返回其 description if the instance happens to be CustomStringConvertible. 使用 CustomStringConvertable 作为泛型约束,或访问 因此,不鼓励直接符合类型的描述。

If it is possible to use the struct instead of class, then nothing additional to do.

struct just prints fine itself to the output

print("\(yourStructInstance)")

or with class like this:

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"

或者, ,为了让您更容易理解,您的 class 和 description方法应该如下所示:

public class MyClass: NSObject {
public var memberAttribute = "I'm an attribute"


public override var description: String {
return "My Class member: \(self.memberAttribute)"
}
}

Note: 因为您正在从 NSObject扩展 Modal 类,所以它不再需要您的类遵从 CustomStringConvertible类,并且您正在从 NSObject类本身重写 description变量。请永远记住,CustomStringConvertible基本上是完全迅捷的方式实现这一点。