Свойство static
определяет свойство типа, которое создается экземпляром один раз и только один раз. Как вы заметили, это происходит лениво, так как статика ведет себя как глобальные. И как The Swift Programming Language: Properties говорит:
Глобальные константы и переменные всегда вычисляются лениво, таким же образом Lazy Stored Properties. В отличие от ленивых хранимых свойств глобальные константы и переменные не должны быть помечены с помощью модификатора lazy
.
Это неявно ленивое поведение, потому что, как Swift Blog: Files and Initialization говорит:
позволяет пользовательские Инициализаторы, время запуска в Swift весы чисто, без глобальных инициализаторов, чтобы замедлить его, и порядок выполнения полностью предсказуемым.
Они сознательно разработали его таким образом, чтобы избежать излишней задержки запуска приложения.
Если вы хотите создать объект static
в какой-то определенный момент вашего приложения (вместо того, чтобы отложить его туда, где он впервые используется), просто укажите это свойство static
в этой более ранней точке, и объект будет инициализирован в это время. Учитывая усилия, которые мы прилагаем к сокращению времени ожидания при запуске наших приложений, вы обычно не захотите этого синхронно во время первого запуска приложения, но вы можете делать это там, где хотите.
Существует некоторое обоснование выбора для глобальных переменных, которые здесь ленивы: https://developer.apple.com/swift/blog/?id=7. Вероятно, статические члены имели бы аналогичное обоснование, за исключением еще меньших оснований для инициализации при запуске (я имею в виду, что, если вы даже не использовали тип, он был просто введен через импорт? Должны ли все статические переменные все еще инициализироваться независимо от использования ?) –