Swift 以下三种声明之间的区别是什么?

Swift 以下三种声明之间的区别是什么?,swift,computed-properties,Swift,Computed Properties,如果我把“let”放在第一个中,编译器会抱怨“computed property不允许let”。好吧,有点道理。第一个和第二个之间的唯一区别是“=”和“()”。那么,这是否意味着它不再是一个计算属性了?这是一个计算的仅获取属性,每次尝试获取它的值时,它都会计算: var title: UILabel { let label = UILabel() textLabel.font = .systemFontOfSize(13) return label } let titl

如果我把“let”放在第一个中,编译器会抱怨“computed property不允许let”。好吧,有点道理。第一个和第二个之间的唯一区别是“=”和“()”。那么,这是否意味着它不再是一个计算属性了?

这是一个计算的仅获取属性,每次尝试获取它的值时,它都会计算:

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
}()
这是由就地调用的闭包(扮演默认值角色)立即初始化的常规属性:

这是lazy属性,只有在就地调用的闭包首次访问时才会初始化该属性:

let title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()
1.

lazy var title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()
var title: UILabel {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}
它是一个只读计算属性。计算属性不能是
let
。这些属性是使用其他存储/计算属性计算的。所以他们没有自己的后备商店。因此,计算属性始终声明为
var

2.

lazy var title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()
var title: UILabel {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}
它是一个
存储属性
。这被分配了一个
closure
,它返回一个
UILabel
对象。此闭包在对象的实例化过程中执行,返回的UILabel对象被分配给
标题

3.

let title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()

它是一个
惰性存储属性
。它还被分配了一个闭包,返回
UILabel
对象。但在实例化过程中不会执行此闭包。每当第一次使用此属性时,都会执行它。在执行闭包之后,返回的
UILabel
对象被分配给
title

除了@PGDev所说的之外,我想指出另一种编写第二个/第三个声明的方法:

而不是:

lazy var title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()
你可以写:

let title: UILabel = {
    let label = UILabel()
    textLabel.font = .systemFontOfSize(13)
    return label
}()
它的功能与上面完全相同,只是代码编写方式不同:)