2016-09-22 57 views
2
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',编译器会抱怨'计算属性不允许let'。好的,有道理。第一个和第二个唯一的区别是'='和'()'。那么,这是否意味着它不再是一个计算属性?以下3种声明有什么区别?

回答

3

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

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

这是一个lazy stored property。还会分配一个返回UILabel对象的闭包。但是这个闭包在实例化过程中不会被执行。只要首次使用该属性,它就会被执行。关闭执行后,返回的UILabel对象被分配给title

1

这是计算只得到属性,它计算每一次当你设法得到它的值:

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

这是immidiatly初始化定期财产就地调用关闭(其中播放默认值的作用) :

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 
}() 
1

除了所有@PGDev说,我想指出的另一种方式来写你的第二/第三声明:

相反的:

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

你可以写:

let title: UILabel = { 
    $0.font = .systemFontOfSize(13) 
    return $0 
}(UILabel()) 

它与上面完全一样,只是代码写法不同:)