Siwft 中属性的懒加载

ObjC中,一般会用这种方式来声明属性的lazy loading。

1
2
3
4
5
6
7
8
9
@property (nonatomic, strong) UIView *defaultView;
- (UIView *)defaultView {
if (!_defaultView) {
_defaultView = [[UIView alloc] initWithFrame:CGRectZero];
}
return _defaultView;
}

上面的代码在Siwft中,会被转成如下:

1.C#一样的写法

1
2
3
4
5
6
7
8
9
10
var _defaultView: UIView? = nil
var defaultView:UIView {
get {
if _defaultView == nil {
_defaultView = UIView(frame: CGRectZero)
}
return _defaultView!
}
}

仅有Getter,可以简写为

1
2
3
4
5
6
7
var defaultView: UIView {
if (!_defaultView) {
_defaultView = UIView(frame: CGRectZero)
}
return _defaultView!
}
var _defaultView: UIView? = nil

2.使用Siwft中提供的lazy方法

1
2
3
4
5
private lazy var defaultView = UIView(frame: CGRectZero)
func someMethod() {
defaultView.background = UIColor.RedColor()
}

如果想在allocated之后立即对对象属性进行修改,可以尝试闭包。

记得一定要在闭包前加上lazy,避免被多次创建。

1
2
3
4
5
lazy var defaultView:UIView = {
let tempView = UIView(frame: CGRectZero)
tempView.backgroundColor = UIColor.RedColor()
return tempView
}()
  • 注意,lazy特性必须定义为变量 var ,而内部因声明后不会被改变,可以声明为常量let

REF::