【问题标题】:Swift equivalent of Java toString()Swift 等价于 Java toString()
【发布时间】:2016-04-13 01:47:12
【问题描述】:

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

【问题讨论】:

标签: ios swift string tostring customstringconvertible


【解决方案1】:

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

您可以通过采用CustomStringConvertible 协议,然后实现description 属性,将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,它将不起作用)

【讨论】:

  • String(obj) 呢?
  • 它适用于结构吗?
  • 是的,CustomStringConvertible 替换了 Printable。 @Antonio,我不记得它是什么时候改变的,但肯定早于 Swift 3。
  • 非常感谢!我更喜欢 Printable,我认为这是一个有意义的名称
  • MyClass 必须从 NSObject 扩展
【解决方案2】:

如果可以使用结构体代替类,那么就没有什么可做的了。

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

print("\(yourStructInstance)")

或者像这样的类:

print(String(describing: yourClassInstance))

【讨论】:

    【解决方案3】:

    你应该使用String(obj)

    直接来自the documentation for CustomStringConvertible

    注意

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

    【讨论】:

    • 似乎description()CustomStringConvertible 方法就足够了。
    【解决方案4】:

    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"here within the Country 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 扩展您的 Modal 类,因此您的类不再需要遵守 CustomStringConvertible 类,并且您正在从 NSObject 类本身覆盖 description 变量。永远记住,CustomStringConvertible 主要是实现这一目标的纯 Swift 方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2014-11-28
      相关资源
      最近更新 更多