【问题标题】: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 代码
  • 您的代码无效。我添加了一个类实现,所以它会编译。如果你想避免保留循环,你可以考虑使用结构而不是类,你可以摆脱初始化器。
  • 当然只是片段

标签: 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)
      

      【讨论】:

        猜你喜欢
        • 2020-06-27
        • 2014-12-24
        • 1970-01-01
        • 2020-04-05
        • 2014-01-03
        • 2014-03-08
        • 2015-08-09
        • 2017-11-11
        • 2010-12-10
        相关资源
        最近更新 更多