【发布时间】:2014-06-03 19:46:04
【问题描述】:
Swift 中的惰性属性是否等同于在 Objective C 中使用惰性加载模式覆盖 getter?
【问题讨论】:
标签: ios objective-c swift lazy-evaluation
Swift 中的惰性属性是否等同于在 Objective C 中使用惰性加载模式覆盖 getter?
【问题讨论】:
标签: ios objective-c swift lazy-evaluation
来自文档:
惰性存储属性是在第一次使用时才计算初始值的属性。您可以通过在声明之前编写惰性属性来指示惰性存储属性。
所以,大多数情况下,是的。
您必须始终将惰性属性声明为变量(使用 var 关键字),因为在实例初始化完成之前可能无法检索其初始值。常量属性在初始化完成之前必须始终有一个值,因此不能声明为惰性。”
请记住,在 Swift 上,您可以选择为您的属性声明自定义 getter 和 setter:
var name : String?{
get{
return "Oscar"
}
set(newValue){
}
}
【讨论】:
参考这个:
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()
SomeFunction() 可以返回 0 或 nil 的情况,RHS 仍然只会被调用一次。
- (id)x { dispatch_once(^{ if(!_x) _x = boa; }); return _x; } [我省略了令牌,因为我总是语法错误:D]
self.x = ... 因为设置翻转了两个变量而变得懒惰。
x = 0 的情况。这是一件棘手的事情。但是,是的,可能还涉及线程安全的锁。
主要是——虽然它不能是计算属性
【讨论】: