如何打印对象? [复制]
Posted
技术标签:
【中文标题】如何打印对象? [复制]【英文标题】:How can I print an object? [duplicate] 【发布时间】:2022-01-22 05:50:53 【问题描述】:我想在 Swift 的控制台中打印一个对象。
在 Java 中,我会覆盖 public String toString()
方法。
如何在 Swift 中做到这一点?
class MyClass
var i : Int
var j : Int
// ...
// method to return a String
return String(i) + ", " + String(j)
var mc = MyClass(5, 10)
print(mc) // 5, 10
【问题讨论】:
这甚至不是有效的 Swift 代码 您的代码无效。我添加了一个类实现,所以它会编译。如果你想避免保留循环,你可以考虑使用结构而不是类,你可以摆脱初始化器。 当然只是片段 【参考方案1】:您需要您的实体符合 CustomStringConvertible
并实现 var description
。
class MyClass: CustomStringConvertible
var i : Int // Integer doesn't exist in swift
var j : Int
var description: String
String(i) + ", " + String(j) // return is implicit
一般来说,Swift 类不继承自任何超类,因此它们没有toString
、equal
等基本方法。
每个实现都需要符合特定的protocol
(一个java interface
)。
【讨论】:
【参考方案2】:您需要使用CustomStringConvertible
或CustomDebugStringConvertible
:
class MyClass
var i: Int
var j: Int
init(i: Int, j: Int)
self.i = i
self.j = j
extension MyClass: CustomStringConvertible
var description: String
"\(i), \(j)"
extension MyClass: CustomDebugStringConvertible
var debugDescription: String
"\(i), \(j)"
作为建议,如果您只是要传递它并且不需要挂在它上面,您可以将其更改为像 struct
这样的值类型,您将免费获得一个初始化程序.
我建议扩展类以利用 CustomStringConvertible
和 CustomDebugStringConvertible
等协议来保持代码整洁。
【讨论】:
【参考方案3】:您需要遵守CustomStringConvertible
协议。然后实现description
属性。
class MyClass: CustromStringConvertible
var i: Int
var j: Int
// ...
var description: String
return "\(i), \(j)"
var mc = MyClass(5, 10)
print(mc) // 5, 10
来自Apple documentation:
符合 CustomStringConvertible 协议的类型可以提供自己的表示形式,以便在将实例转换为字符串时使用。 String(describing:) 初始化程序是将任何类型的实例转换为字符串的首选方法。如果传递的实例符合 CustomStringConvertible,则 String(describing:) 初始化器和 print(_:) 函数使用实例的自定义描述属性。
不鼓励直接访问类型的描述属性或使用 CustomStringConvertible 作为通用约束。
出于调试目的,您可能希望符合 CustomDebugStringConvertible
并改为实现 debugDescription
(documentation)。
这看起来像这样(游乐场文件):
import Foundation
struct Point
let x: Int, y: Int
extension Point: CustomStringConvertible
var description: String
return "NON-DEBUG - (\(x), \(y))"
extension Point: CustomDebugStringConvertible
var debugDescription: String
return "DEBUG - (\(x), \(y))"
let p = Point(x: 21, y: 30)
print(p)
// NON-DEBUG - (21, 30)
print(String(reflecting: p))
// DEBUG - (21, 30)
【讨论】:
以上是关于如何打印对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 for 语句或枚举打印 NSArray 对象? [复制]