2016-01-07 8 views
24

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

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

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

var z = Foo.bar 
z = Foo.bar 

Каким Обоснование этого?

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

+5

Существует некоторое обоснование выбора для глобальных переменных, которые здесь ленивы: https://developer.apple.com/swift/blog/?id=7. Вероятно, статические члены имели бы аналогичное обоснование, за исключением еще меньших оснований для инициализации при запуске (я имею в виду, что, если вы даже не использовали тип, он был просто введен через импорт? Должны ли все статические переменные все еще инициализироваться независимо от использования ?) –

ответ

39

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

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

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

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

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

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

+0

В примере «static let cache = NSCache()», инициализируется кеш при запуске, или, только когда «кеш используется впервые» ...? – Fattie

+0

Это лениво. Я обновил свой ответ, чтобы уточнить этот момент. – Rob

 Смежные вопросы

  • Нет связанных вопросов^_^