以下3个声明有什么区别?

时间:2016-09-22 09:47:25

标签: swift computed-properties

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',编译器会抱怨'计算属性不允许'。好吧,有点理智。第一个和第二个之间的唯一区别是'='和'()'。那么,这是否意味着它不再是计算属性了?

3 个答案:

答案 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())

它与上面完全相同,只是代码的编写方式不同:)