swift中lazy 修饰符和 lazy 方法以及get、set
2018-05-28 本文已影响35人
危险地带_浅笑
1,懒加载的写法
class ClassA {
lazy var str: String = {
let str = "Hello"
print("只在首次访问输出")
return str
}()
}
2,lazy修饰方法
另外一个不太引起注意的是,在 Swift 的标准库中,我们还有一组 lazy 方法,它们的定义是这样的:
func lazy<S : SequenceType>(s: S) -> LazySequence<S>
func lazy<S : CollectionType where S.Index : RandomAccessIndexType>(s: S)
-> LazyRandomAccessCollection<S>
func lazy<S : CollectionType where S.Index : BidirectionalIndexType>(s: S)
-> LazyBidirectionalCollection<S>
func lazy<S : CollectionType where S.Index : ForwardIndexType>(s: S)
-> LazyForwardCollection<S>
这些方法可以配合像 map 或是 filter 这类接受闭包并进行运行的方法一起,让整个行为变成延时进行的。在某些情况下这么做也对性能会有不小的帮助。例如,直接使用 map 时:
let data = 1...3
let result = data.map {
(i: Int) -> Int in
print("正在处理 \(i)")
return i * 2
}
print("准备访问结果")
for i in result {
print("操作后结果为 \(i)")
}
print("操作完毕")
这么做的输出为:
// 正在处理 1
// 正在处理 2
// 正在处理 3
// 准备访问结果
// 操作后结果为 2
// 操作后结果为 4
// 操作后结果为 6
// 操作完毕
而如果我们先进行一次 lazy 操作的话,我们就能得到延时运行版本的容器:
let data = 1...3
let result = data.lazy.map {
(i: Int) -> Int in
print("正在处理 \(i)")
return i * 2
}
print("准备访问结果")
for i in result {
print("操作后结果为 \(i)")
}
print("操作完毕")
此时的运行结果:
// 准备访问结果
// 正在处理 1
// 操作后结果为 2
// 正在处理 2
// 操作后结果为 4
// 正在处理 3
// 操作后结果为 6
// 操作完毕
对于那些不需要完全运行,可能提前退出的情况,使用 lazy 来进行性能优化效果会非常有效。
注:以上内容摘录来自: 王巍 (onevcat). “Swifter - Swift 必备 Tips (第四版)”。
3,get/set方法
var _name:String?
var name:String?{
get{
return _name;
}
set{
// 只要外界通过.name给name赋值,就会把值给newValue ,我刚学swift的时候,不知道这个newValue
age = newValue
_name = newValue
}
}
4,didSet/willSet
var score:String?{
didSet{
print("oldValue:\(oldValue)");
}
willSet{
print("newValue:\(newValue)")
}
}
上面内容不多说,看打印就知道怎么回事,最主要要知道默认的的两个参数oldValue
和newValue