【发布时间】:2014-06-13 05:09:24
【问题描述】:
查看苹果提供的用于快速构建核心数据堆栈的样板代码,我发现为堆栈中的每个项目创建了两个变量,例如managedObjectModel 和 _managedObjectModel。我的理解是,一个属性的内部存储变量是由swift在内部创建和管理的,那么为什么我们必须手动创建一个呢?为什么我们不能只创建一个属性,让 swift 处理创建过程,如果在调用时不存在。提前致谢。
【问题讨论】:
查看苹果提供的用于快速构建核心数据堆栈的样板代码,我发现为堆栈中的每个项目创建了两个变量,例如managedObjectModel 和 _managedObjectModel。我的理解是,一个属性的内部存储变量是由swift在内部创建和管理的,那么为什么我们必须手动创建一个呢?为什么我们不能只创建一个属性,让 swift 处理创建过程,如果在调用时不存在。提前致谢。
【问题讨论】:
没有创建两个属性 - 一个是存储的属性,一个是计算的属性。模式是:
class Foo {
var _bar : Bar
var bar : Bar { return _bar }
}
var _bar 已存储,但 var bar 已计算。特定的 Apple 模式用于延迟初始化存储的属性,如下所示:
class Foo {
var _bar : Bar? = nil
var bar : Bar {
if _bar == nil {
/* compute some stuff */
_bar = Bar (/* ... */)
}
return _bar!
}
}
上面的用法很像@lazy property。你可以和它合二为一:
class Foo {
@lazy var bar : Bar = computeBar ()
func computeBar () -> Bar {
/* compute some stuff */
return Bar (/* ... */)
}
}
【讨论】:
@lazy 确实会导致存储属性;该属性的值是在第一次访问惰性属性时计算的。正如您所指出的,他们的样板代码中使用的 Apple 模式适用于 @lazy。见上面的编辑。