Swift中等价于Java的toString()方法

127

在Swift中,与Java的toString()方法等效的是什么,用于打印类实例的状态?


更多信息请参见https://dev59.com/KGAf5IYBdhLWcg3w_W9j。 - Marcus Leon
这回答解决了您的问题吗?如何在Swift中更改类型的文本表示形式? - Top-Master
4个回答

151

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,它将无法正常工作)


3
适用于结构吗? - lmiguelvargasf
2
是的,CustomStringConvertible 取代了 Printable。@Antonio,我不记得它是什么时候改变的,但肯定早在 Swift 3 之前就已经改变了。 - vacawama
@Antonio,根据这篇文章,变化发生在Swift 2。https://www.raywenderlich.com/108522/whats-new-in-swift-2 - vacawama
1
非常感谢!我更喜欢Printable,我认为这是一个有意义的名称。 - Antonio
1
MyClass 必须从 NSObject 扩展。 - DàChún
显示剩余6条评论

8
如果可以使用struct而不是class,则无需进行任何其他操作。
struct本身可以很好地输出到输出流中。
print("\(yourStructInstance)")

或者像这样使用类:
print(String(describing: yourClassInstance))

6

如何使用扩展自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" 中。
或者,为了让你更容易理解,你的类和 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类,并且您正在覆盖来自NSObject类本身的description变量。请记住,CustomStringConvertible通常是实现此目的的纯Swift方式。


6

您应该使用String(obj)

来自CustomStringConvertible文档

注意

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


似乎CustomStringConvertibledescription()方法就足够了。 - Greg Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接