В соответствии с веткой форума, на которую вы ссылаетесь, область действия 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 - это локальная область видимости, как в функции, в то время как верхняя область видимости в других файлах - это глобальные области видимости.