如何打印对象? [复制]

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 类不继承自任何超类,因此它们没有toStringequal 等基本方法。

每个实现都需要符合特定的protocol(一个java interface)。

【讨论】:

【参考方案2】:

您需要使用CustomStringConvertibleCustomDebugStringConvertible

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 这样的值类型,您将免费获得一个初始化程序.

我建议扩展类以利用 CustomStringConvertibleCustomDebugStringConvertible 等协议来保持代码整洁。

【讨论】:

【参考方案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)

【讨论】:

以上是关于如何打印对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中打印二维对象数组? [复制]

如何有效地漂亮打印 JSON 对象列表? [复制]

如何通过 for 语句或枚举打印 NSArray 对象? [复制]

我将如何遍历一组 JS 对象并为每个对象打印一条语句? [复制]

打印 JavaScript 对象的内容? [复制]

如何从打印的数据帧字符串中加载数据帧? [复制]