Swift等效于Java toString()


Answers:


122

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


String(obj)
nielsbot '16

还有.debugDescription一个对程序员更友好的版本
nielsbot

2
它适用于结构吗?
lmiguelvargasf '16

1
是的,CustomStringConvertible替换为Printable。@Antonio,我不记得它何时更改,但是肯定早在Swift 3之前
。– vacawama

1
在myClass必须从NSObject的扩展
大椿

7

如果可以使用struct代替class,则无需执行其他操作。

struct只会将其自身打印到输出中

print("\(yourStructInstance)")

或像这样的课程:

print(String(describing: yourClassInstance))

6

您应该使用String(obj)

直接来自CustomStringConvertible的文档

注意

String(instance)将适用于任何类型的实例,如果该实例碰巧是CustomStringConvertible,则返回其描述。因此,不建议将CustomStringConvertible用作一般约束,或直接访问符合类型的描述。


好像的description()方法CustomStringConvertible就足够了。
格雷格·布朗

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}"
}

您可以Country班级内的“ CountryPicker iOS Swift库”中检查我的操作方式。

或者,为了使您更容易理解,您的类和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该类,并且您正在descriptionNSObject类本身覆盖变量。永远记住,CustomStringConvertible主要是实现这一目标的纯Swift方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.