Подтвердить что ты не робот

Неявно ленивые статические члены в Swift

Я только заметил, что static члены Swift structs неявно lazy.

Например, это вызовет только один раз init:

class Baz {
    init(){
        print("initializing a Baz")
    }
}
struct Foo {
    static let bar = Baz()
}

var z = Foo.bar
z = Foo.bar

В чем причина этого?

Что делать, если я хочу иметь противоположное поведение?

4b9b3361

Ответ 1

Свойство static определяет свойство типа, которое создается один раз и только один раз. Как вы заметили, это происходит лениво, так как статика ведет себя как глобальные. И как Язык Swift Programming: Свойства говорит:

Глобальные константы и переменные всегда вычисляются лениво, аналогично Lazy Stored Properties. В отличие от ленивых хранимых свойств глобальные константы и переменные не должны быть помечены модификатором lazy.

Это неявное поведение связано с тем, что, поскольку Swift Blog: Files and Initialization говорит:

он позволяет настраивать инициализаторы, время запуска в Swift четко, без глобальных инициализаторов, чтобы замедлить его, и порядок выполнения полностью предсказуем.

Они сознательно разработали его таким образом, чтобы избежать излишней задержки запуска приложения.

Если вы хотите создать экземпляр свойства static в какой-то определенной точке вашего приложения (вместо того, чтобы отложить его до того, где он впервые был использован), просто ссылайтесь на это свойство static в этой более ранней точке, и объект будет инициализирован в то время. Учитывая усилия, которые мы прилагаем к сокращению времени ожидания при запуске наших приложений, вы обычно не захотите этого синхронно во время первого запуска приложения, но вы можете делать это там, где хотите.