Swift 相当于 Java toString()
Swift equivalent of Java toString()
打印 class 实例状态的 Swift 等同于 Java toString()
的内容是什么?
description
属性 就是您要找的。这是打印包含对象的变量时访问的 属性。
您可以通过采用协议 CustomStringConvertible
然后实施 description
属性.[=20= 将 description
添加到您自己的 classes ]
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
相反,如果 class 未实现 CustomStringConvertible
,后者将不起作用)
你应该使用 String(obj)
.
直接来自the documentation for CustomStringConvertible:
NOTE
String(instance) will work for an instance of any type, returning its
description if the instance happens to be CustomStringConvertible.
Using CustomStringConvertible as a generic constraint, or accessing a
conforming type's description directly, is therefore discouraged.
如果可以使用 struct 而不是 class,则无需执行任何其他操作。
struct 本身就很好地打印到输出
print("\(yourStructInstance)")
或像这样 class:
print(String(describing: yourClassInstance))
如何使用 NSObject
扩展 classes
如果您的模型 class 是从 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, in the "CountryPicker iOS Swift library"。
或者, 为了让您更容易理解,您的 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
扩展模态 class,因此您的 class 不再需要遵守 CustomStringConvertible
class,并且您正在覆盖 description
来自 NSObject
class 本身的变量。永远记住,CustomStringConvertible
主要是实现此目标的纯粹 Swift 方式。
打印 class 实例状态的 Swift 等同于 Java toString()
的内容是什么?
description
属性 就是您要找的。这是打印包含对象的变量时访问的 属性。
您可以通过采用协议 CustomStringConvertible
然后实施 description
属性.[=20= 将 description
添加到您自己的 classes ]
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
相反,如果 class 未实现 CustomStringConvertible
,后者将不起作用)
你应该使用 String(obj)
.
直接来自the documentation for CustomStringConvertible:
NOTE
String(instance) will work for an instance of any type, returning its description if the instance happens to be CustomStringConvertible. Using CustomStringConvertible as a generic constraint, or accessing a conforming type's description directly, is therefore discouraged.
如果可以使用 struct 而不是 class,则无需执行任何其他操作。
struct 本身就很好地打印到输出
print("\(yourStructInstance)")
或像这样 class:
print(String(describing: yourClassInstance))
如何使用 NSObject
扩展 classes
如果您的模型 class 是从 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, in the "CountryPicker iOS Swift library"。
或者, 为了让您更容易理解,您的 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
扩展模态 class,因此您的 class 不再需要遵守 CustomStringConvertible
class,并且您正在覆盖 description
来自 NSObject
class 本身的变量。永远记住,CustomStringConvertible
主要是实现此目标的纯粹 Swift 方式。