113

toString()打印类实例状态的 Swift 等价物是什么?

4

4 回答 4

143

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

于 2016-04-13T01:51:49.843 回答
7

如果可以使用结构而不是类,那么无需做任何额外的事情。

struct 只是将自身打印到输出中

print("\(yourStructInstance)")

或者像这样的类:

print(String(describing: yourClassInstance))
于 2017-03-02T16:55:49.373 回答
6

你应该使用String(obj).

直接来自CustomStringConvertible 的文档

笔记

String(instance) 将适用于任何类型的实例,如果该实例恰好是 CustomStringConvertible,则返回其描述。因此,不鼓励使用 CustomStringConvertible 作为通用约束,或直接访问符合类型的描述。

于 2016-04-13T02:02:32.830 回答
5

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 实现这一点的方式。

于 2018-08-05T10:59:22.073 回答