一尘不染

快速延迟加载属性

swift

我正在尝试把我的头围住Swift语言。使用Objective-C在代码中构建视图时,常见的模式是覆盖UI属性并像这样延迟加载它们:

@property(nonatomic, strong) UILabel *myLabel;

- (UILabel *)myLabel
{
     if (!_myLabel) {
         _myLabel = [[UILabel alloc] initWithFrame:CGRectMake(20.0f, 75.0f, 320.0f, 20.0f)];
        [_myLabel setFont:[UIFont subHeadlineFont]];
        [_myLabel setTextColor:[UIColor subHeadlineColor]];
        [_myLabel setText:@"Hello World"];
     }
     return _myLabel;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view addSubview:self.myLabel];
}

这允许将UIElement的配置包含在其设置中,但是不会导致每次都对其进行重新配置。

看来我们无权访问Swift中的后备存储,并且@lazy关键字实际上没有相同的语义。

我很好奇是否有人在Swift中找到了类似的模式,该模式允许人们以一种简洁的语法方式将变量和常量的配置及其声明保持在一起,而不会每次都重新配置?


阅读 184

收藏
2020-07-07

共1个答案

一尘不染

我认为lazy用闭包初始化的属性可以工作:

lazy var myLabel: UILabel = {
    var temporaryLabel: UILabel = UILabel()
    ...
    return temporaryLabel
}()

当我阅读“ Swift编程语言”时。(棋盘格示例)关闭只评估一次)。

2020-07-07