Как глобальная переменная / константы ленивы в быстром - PullRequest
0 голосов
/ 16 апреля 2020

Из docs.swift.org

Глобальная переменная

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

Свойства типа

Свойства хранимого типа лениво инициализируются при первом доступе .

Поэтому я проверяю ленивость обоих из них следующим образом

import Foundation
import CoreFoundation

var s = Date()
struct Sam {
    static let s  = Date()
}


print(Date())

Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false, block: { (t) in
    print(Sam.s)
    print(s)
    exit(0)
})

CFRunLoopRun()

Я не запускал его на детской площадке. Фолк из forums.swift.org предложил не запускать его с игровой площадки.

Поэтому я храню его в файле с именем main.swift, а затем запускаю его, используя swift main.swift

Выводится следующим образом

2020-04-16 18:23:48 + 0000
2020-04-16 18:23:50 + 0000
2020-04 -16 18:23:48 + 0000

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

Заранее спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

В соответствии с веткой форума, на которую вы ссылаетесь, область действия main.swift аналогична области действия Swift Playground, переменные, объявленные на верхнем уровне, обрабатываются как локальные переменные, а не как глобальные переменные.

В вашем пример s - это локальная переменная, поэтому она не инициализируется лениво.

Создайте новый файл и объявите только s (я изменил имена, чтобы быть более понятными):

// otherFile.swift

import Foundation

let globalS = Date()

Тогда в вашей главной:

// main.swift

import Foundation

struct S {
  static let classS = Date()
}

let localS = Date()

print("Reference date:      \(Date())")
sleep(2)
print("Local var s date:    \(localS)")
print("Global var s date:   \(globalS)")
print("Class property date: \(S.classS)")

Это должно напечатать что-то вроде:

Reference date:      2020-04-16 21:47:47 +0000
Local var s date:    2020-04-16 21:47:47 +0000
Global var s date:   2020-04-16 21:47:49 +0000
Class property date: 2020-04-16 21:47:49 +0000

Локальный var имеет то же время, что и эталонное время, поэтому он был инициализирован с нетерпением. Stati c var и global через две секунды, доказывая, что они были созданы лениво, во время вызова.

Это демонстрирует разницу между глобальной и локальной переменными: верхний уровень область видимости вашего main - это локальная область видимости, как в функции, в то время как верхняя область видимости в других файлах - это глобальные области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...