Это из-за следующих двух причин:
Каждое глобальное свойство лениво относится к компьютеру. Не интуитивно понятно, что их не нужно отмечать lazy
.
Круговая зависимость не допускается
Более простой пример того, что сказал Мэтт:
class X {
static var a = 10
static var b = 20
}
class Y {
static var a = 10 * Y.b
static var b = 20
}
class Z {
static var a = 10 * Z.b
static var b = 20 * Z.a // ERROR: Type 'Z' has no member 'a'
}
класс Z
недопустим, потому что у вас круговая зависимость. Но я не думаю, что ошибка не ясна.
Это означает, что компилятор попытается выяснить зависимости и начнет строить тип из значения, которое ни от чего не зависит, затем перейдет к построениюдругие свойства типа. Но если он не может этого сделать, он выдаст ошибку!
Как вы упомянули в комментариях. docs говорят:
Глобальные константы и переменные всегда вычисляются лениво, аналогично Lazy Stored Properties. В отличие от ленивых хранимых свойств, глобальные константы и переменные не должны быть отмечены модификатором lazy.
Локальные константы и переменные никогда не вычисляются лениво.
Следующее будетпропустите компилятор, но он потерпит крах при доступе к свойству
class C {
lazy var a : Int = {
let _a = self.b + 30
return _a
}()
lazy var b : Int = {
let _b = self.a + 20
return _b
}()
}
let d = C().a // ERROR!
Так что, как вы можете видеть для обоих, вам нужно создать экземпляр / тип на основе сохраненного значения, а затем вычислить другие свойства из этого.