Поскольку Apple заявляет , автоматическое закрытие позволяет вам отложить оценку, потому что код внутри не запускается, пока вы не вызовете закрытие. , почему оценка задержки автоматического закрытия и нормальный курс не работают?
Я позаимствовал фрагмент с автоматическим закрытием у John Sundell , чтобы сравнить с / без автоматического замыкания.
func assert2(_ expression: @autoclosure () -> Bool,
_ message: @autoclosure () -> String) {
guard isDebug else {
return
}
// Inside assert we can refer to expression as a normal closure
if !expression() {
assertionFailure(message())
}
}
func assert3(_ expression: () -> Bool,
_ message: () -> String) {
guard isDebug else {
return
}
// Inside assert we can refer to expression as a normal closure
if !expression() {
assertionFailure(message())
}
}
Но, похоже, message()
не будет выполняться в обоих случаях.
Единственная разница для меня в том, что мне нужно закрывать вручную:
override func viewDidLoad() {
super.viewDidLoad()
assert2(false, "hello2")
assert3({return false}, {return "hello3"})
}
Есть ли какая-то другая причина, по которой Apple и Джон Санделл говорят, что автоматическое закрытие задерживает выполнение? Например, выполняется ли предварительная оценка нормального закрытия из-за оптимизации из Xcode? Или какие-то другие причины, по которым закрытие ведет себя подобным образом?
Пожалуйста, предоставьте официальный документ, если есть какой-либо, который прямо объясняет этот момент.