Почему иногда быстрая статическая переменная инициализируется неправильно при компиляции для оптимизации скорости - PullRequest
4 голосов
/ 19 сентября 2019

Недавно я столкнулся с проблемой, что иногда статические переменные 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 выполнит некоторую сложную работу.

1 Ответ

3 голосов
/ 19 сентября 2019

Об этой ошибке сообщается как SR-11494 .Свойства хранимого типа должны быть лениво инициализированы при первом доступе.Согласно Документация

Однако в этом случае при компиляции с флагом оптимизации инициализация хранимого свойства Type вызывается во время компиляции.

Вы можете изменить someValue в свойствах вычисляемого типа, тогда он вызывается только в runtime .

class MainView: UIView {
   static var someValue: Int {
        print("some value init")
        return 1
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...