为什么 CustomStringConvertible 协议描述被多次调用?

Why CustomStringConvertible protocol description being called multiple times?

我在 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 次。

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

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

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