Почему описание протокола CustomStringConvertible вызывается несколько раз?

Я написал структуру на игровой площадке iOS и хочу настроить ее формат печати.

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 раза.

1 ответ

Решение

Если вы используете игровую площадку, описание значения может быть вычислено несколько раз, поскольку оно будет отображаться в нескольких местах (например, справа).

Если вы выполняете код в более контролируемой среде (например, в скомпилированном коде или в REPL в терминале), вы заметите, что y in the range будет напечатан только один раз.

Также следует избегать побочных эффектов (например, print заявления) в вычисляемых свойствах.

Другие вопросы по тегам