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的主要内容,如果未能解决你的问题,请参考以下文章