【问题标题】:Swift equivalent of lazy Property getterSwift 等价于惰性属性 getter
【发布时间】:2015-05-15 04:36:02
【问题描述】:

以下表达式的 Swift 等价物是什么:

@property (strong, nonatomic) UIView *topView;

- (UIView *)topView {
...
}

是不是如下:

var topView: UIView {
  get {
    ...
  }
}

如果前者是真的,有没有办法定义一个外部getter?

【问题讨论】:

标签: objective-c swift properties


【解决方案1】:

认为您要问的是如何实现类似于以下内容的内容:

@property (nonatomic, strong) UIView *topView

- (UIView *)topView {
    if (_topView == nil) {
        _topView = //...
        // configure _topView...
    }
    return _topView;
}

这个惰性属性 getter 在 Swift 中很容易实现:

lazy var topView: UIView = {
    let view = //...
    // configure view...
    return view
}()

这会导致只读变量仅在第一次访问时才被初始化。您发布的 Swift 代码是一个计算的只读属性,每次访问时都会对其进行评估。

【讨论】:

  • 即使在您发布的惰性示例中,我也需要一个辅助变量,对吗?或者我可以直接设置topView吗?
  • @confile 不,惰性示例是自包含的。 topView 变量被初始化为紧跟在“=”之后的闭包的返回值。如果可以一行完成初始化,则不需要闭包,例如:lazy var topView = UIView(frame: CGRect.zeroRect)。我强烈推荐阅读'Properties' chapter of The Swift Programming Language
  • Answer 提到“这会导致只读变量在第一次访问时被初始化一次,之后就无法更改”。据我所知,lazy 变量可以在实例化后重新分配。
  • @sabajt 你说得对,谢谢。我不确定这是否是自 Swift 1.0 以来发生变化的行为,或者我是否只是做了一个错误的假设(我觉得我之前尝试过改变惰性变量但失败了,但我找不到证据证明它有从未改变)。不管怎样,我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2015-03-18
  • 2017-10-29
  • 2014-11-20
  • 1970-01-01
  • 2017-07-29
  • 2017-05-05
相关资源
最近更新 更多