【问题标题】:Swift: why lazy, computed property, and property observer can not be letSwift:为什么不能让惰性、计算属性和属性观察者
【发布时间】:2020-03-03 21:15:55
【问题描述】:
我一直在寻找为什么惰性、计算属性和属性观察者不能是(让)常量,我知道例如惰性在被访问之前不会被分配,但为什么它不能是(让),是吗?意味着懒惰在被访问并分配给我们分配的值之前将持有一个 nil 值或任何值?请为计算属性和属性观察者解释同样的事情。
【问题讨论】:
-
你可以很容易地测试它什么时候会有一个值,只需在lazy 块内放一个print。在您访问该值之前,它不会被触发。在此之前,该值甚至不是nil。它从未定义过。有关更多信息,请参阅here
标签:
ios
swift
lazy-evaluation
let
【解决方案1】:
规则:-
- 您可以使用
let 或var 关键字声明属性。
- 在swift中,
let变量必须在let变量的所有者被初始化之前被初始化。
- 为
let 变量赋值后,您将无法再次更改其值。
现在让我们一一查看所有三种类型的属性:-
- 惰性变量 - 它在所有者初始化后初始化。所以,这里违反了规则 2。
- 计算变量 - 每当您访问计算变量时,它都会在一些计算/操作后返回值。所以,这里违反了规则 3。
- 属性观察者 - 属性观察者的
didSet 或willSet 在您更改其值时被调用。所以,这里违反了规则 3。
【解决方案2】:
惰性属性:您必须始终将惰性属性声明为变量(使用 var 关键字),因为在实例初始化完成之前可能无法检索其初始值。在初始化完成之前,常量属性必须始终有一个值,因此不能声明为惰性。
计算属性:计算属性计算(而不是存储)一个值。相反,它们提供了一个 getter 和一个可选的 setter 来间接检索和设置其他属性和值。
属性观察者 : 属性观察者是监视属性值的变化,如果你定义它 let 那么你如何监视变化,因为 let 是一种常量,在初始化后你不能改变。