Swift 中的惰性属性相当于 Objective C 中的惰性 Init getter

Posted

技术标签:

【中文标题】Swift 中的惰性属性相当于 Objective C 中的惰性 Init getter【英文标题】:lazy attribute in Swift equivalent to lazy Init getter in Objective C 【发布时间】:2014-06-03 19:46:04 【问题描述】:

Swift 中的惰性属性是否等同于在 Objective C 中使用惰性加载模式覆盖 getter?

【问题讨论】:

【参考方案1】:

来自文档:

惰性存储属性是在第一次使用时才计算初始值的属性。您可以通过在声明之前编写惰性属性来指示惰性存储属性。

所以,大多数情况下,是的。

您必须始终将惰性属性声明为变量(使用 var 关键字),因为在实例初始化完成之前可能无法检索其初始值。常量属性在初始化完成之前必须始终有一个值,因此不能声明为惰性。”

请记住,在 Swift 上,您可以选择为您的属性声明自定义 getter 和 setter:

var name : String?
  get
    return "Oscar"
  
  set(newValue)

  

【讨论】:

谢谢。与使用 @Lazy 属性相比,在 Swift 的自定义 getter 中(如果可能)声明惰性模式有什么好处吗? 在这 24 小时的测试中我没有看到。不过,这可能会改变。 感谢您的快速回复。 我的荣幸。你总是可以选择正确的答案:-)【参考方案2】:

参考这个:

lazy var x = SomeFunction()

Objective-C 中最接近的等价物是这样的:

@property BOOL xHasBeenSet;
@property id x;

- (id)x

    if (!self.xHasBeenSet) 
        self.x = SomeFunction();
    
    return x;


- (void)setX:(id)x

    _x = x;
    self.xHasBeenSet = YES;

在这里,您只会在第一次读取x 时看到调用SomeFunction,但前提是您没有先设置x。需要注意的是,只有一个代码路径可以调用右侧,并且它永远不会重置回 xHasBeenSet = NO

【讨论】:

???那将是....奇怪。两个属性使一个懒惰?就做- (id)x if(!_x) _x = someFunction() @Daij-Djan 对于 SomeFunction() 可以返回 0 或 nil 的情况,RHS 仍然只会被调用一次。 好的 -- 然后使用 dispatch_once - (id)x dispatch_once(^ if(!_x) _x = boa; ); return _x; [我省略了令牌,因为我总是语法错误:D] self.x = ... 因为设置翻转了两个变量而变得懒惰。 @Daij-Djan 这错过了有人在调用之前设置x = 0 的情况。这是一件棘手的事情。但是,是的,可能还涉及线程安全的锁。【参考方案3】:

主要是——虽然它不能是计算属性

【讨论】:

以上是关于Swift 中的惰性属性相当于 Objective C 中的惰性 Init getter的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的惰性只读属性

如何通过 Swift 中的闭包设置惰性计算属性的值?

如何在 Swift 中的变异结构上正确地创建惰性派生属性?

Swift 常量默认是惰性的吗?

Swift 相当于我的 Objective-C 块

Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性