Недавно я столкнулся с проблемой, что иногда статические переменные swift неправильно инициализируются.Эта проблема может быть воспроизведена при компиляции для оптимизации скорости (который является уровнем оптимизации по умолчанию для модели выпуска в XCode).См. Коды ниже:
class MainView: UIView {
static let someValue: Int = {
print("some value init")
return 1
}()
}
class ViewController: UIViewController {
var falseValue = false
var falseValue2 = false
override func viewWillAppear(_ animated: Bool) {
if falseValue {
print(MainView.someValue)
}
if falseValue2 {
print(MainView.someValue)
}
}
}
Для кода выше MainView.someValue
не следует инициализировать, но при компиляции в модели выпуска или оптимизации по скорости (-o) будет напечатано some value init
, что означает, что someValue
был инициализирован.Но ни одна из инструкций print в if
не выполняется.
Почему компиляция выполняет эту оптимизацию?И это приведет к некоторой логической ошибке, когда блок инициализации someValue
выполнит некоторую сложную работу.