Swift相当于Java toString()

时间:2016-04-13 01:47:13

标签: ios swift string tostring customstringconvertible

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

4 个答案:

答案 0 :(得分:89)

您正在寻找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则无效}

答案 1 :(得分:7)

如果可以使用struct而不是class,那么就不用做了。

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

print("\(yourStructInstance)")

或像这样的类:

print(String(describing: yourClassInstance))

答案 2 :(得分:6)

您应该使用String(obj)

直接来自the documentation for CustomStringConvertible

  

请注意

     

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

答案 3 :(得分:2)

如何使用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}"
}

您可以在here within the Country class"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)"
   }
}

注意: 由于您是从NSObject扩展Modal类,因此不再需要您的类遵守CustomStringConvertible类,并且您将从description类覆盖NSObject变量本身。永远记住,CustomStringConvertible主要是实现这一目标的纯粹Swift方式。