var title: UILabel {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}
let title: UILabel = {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}()
lazy var title: UILabel = {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}()
如果我在第一个中放入'let',编译器会抱怨'计算属性不允许'。好吧,有点理智。第一个和第二个之间的唯一区别是'='和'()'。那么,这是否意味着它不再是计算属性了?
答案 0 :(得分:4)
1。
var title: UILabel {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}
read only computed property
。计算属性不能为let
。这些是使用其他存储/计算属性计算的。所以他们没有自己的后援店。因此,计算属性始终声明为var
。
2。
let title: UILabel = {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}()
stored property
。这将分配一个closure
,返回UILabel
个对象。此闭包在对象的实例化过程中执行,并且返回的UILabel对象已分配给title
。
第3 强>
lazy var title: UILabel = {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}()
lazy stored property
。它还被赋予一个返回UILabel
对象的闭包。但是在实例化过程中不执行此闭包。只要首次使用此属性,就会执行它。执行闭包后,返回的UILabel
对象将分配给title
。
答案 1 :(得分:1)
这是计算的get-only属性,每次尝试获取值时都会计算:
var title: UILabel {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}
这是通过就地调用的闭包(它扮演默认值角色)而无限初始化的常规属性:
let title: UILabel = {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}()
这是惰性属性,仅在首次访问时通过就地调用的闭包进行初始化:
lazy var title: UILabel = {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}()
答案 2 :(得分:1)
除了所有@PGDev所说的,我想指出另一种写你的第二/第三声明的方式:
而不是:
let title: UILabel = {
let label = UILabel()
textLabel.font = .systemFontOfSize(13)
return label
}()
你可以写:
let title: UILabel = {
$0.font = .systemFontOfSize(13)
return $0
}(UILabel())
它与上面完全相同,只是代码的编写方式不同:)