Swift 相当于 Java toString()

Swift equivalent of Java toString()

打印 class 实例状态的 Swift 等同于 Java toString() 的内容是什么?

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

您可以通过采用协议 CustomStringConvertible 然后实施 description 属性.[=20= 将 description 添加到您自己的 classes ]

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 相反,如果 class 未实现 CustomStringConvertible,后者将不起作用)

你应该使用 String(obj).

直接来自the documentation for CustomStringConvertible

NOTE

String(instance) will work for an instance of any type, returning its description if the instance happens to be CustomStringConvertible. Using CustomStringConvertible as a generic constraint, or accessing a conforming type's description directly, is therefore discouraged.

如果可以使用 struct 而不是 class,则无需执行任何其他操作。

struct 本身就很好地打印到输出

print("\(yourStructInstance)")

或像这样 class:

print(String(describing: yourClassInstance))

如何使用 NSObject 扩展 classes

如果您的模型 class 是从 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}"
}

你可以看看我是怎么做到的here within the Country class, in the "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)"
   }
}

注: 由于您正在从 NSObject 扩展模态 class,因此您的 class 不再需要遵守 CustomStringConvertible class,并且您正在覆盖 description 来自 NSObject class 本身的变量。永远记住,CustomStringConvertible 主要是实现此目标的纯粹 Swift 方式。