【问题标题】:Why CustomStringConvertible protocol description being called multiple times?为什么 CustomStringConvertible 协议描述被多次调用?
【发布时间】:2017-06-26 13:29:21
【问题描述】:

我在 iOS Playground 中写了一个结构体,想自定义它的打印格式。

struct Point {
    let x: Int, y: Int
}

extension Point: CustomStringConvertible {
    var description: String {
       switch (x, y) {
       case let (x, 1..<10):
          print("y in the range")
          return "(\(x), 1..<10)"
       default:
          return "(\(x), \(y))"
      }
   }
}

let p = Point(x: 1, y: 1)
print(p)

结果是

我无法理解,即使我只调用了一次 print,但 y in the range 消息被打印了 4 次。

【问题讨论】:

  • 无法复制。 – 等等:你在操场上试过吗?
  • @MartinR 真的吗?因为我创建了一个新的 iOS Playground 来双重确认,所以控制台会在我发布时打印
  • A Playground 在右栏中显示值,因此多次调用description
  • 我的一般(免费!)建议:如果在 Playground 中发生了您不理解的任何事情,请改为在已编译的项目中尝试。然后根据需要使用调试器。
  • 谢谢@MartinR

标签: swift customstringconvertible


【解决方案1】:

如果您使用的是游乐场,一个值的描述可能会被计算多次,因为它会显示在多个位置(例如右侧)。

如果您在更受控制的环境中执行代码(例如在编译代码或终端的 REPL 中),您会注意到 y in the range 只会打印一次。

您还应该避免计算属性中的副作用(如print 语句)。

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多