Swift - 懒加载一个属性,可以做零后
问题描述:
我正在寻找一种方式来懒加载我的变量,但我希望能够使它为零后,然后重新获得它。例如,在存在内存警告的情况下,我想清除任何未使用的内容,然后在稍后再次需要时重新创建它。Swift - 懒加载一个属性,可以做零后
下面是我将如何在Objective-C和我目前的解释中迅速做到这一点。我不确定它保留了保持当前导航的变量。
的OBJ-C实现
@property (strong, nonatomic, readwrite) UINavigationController *navController;
...
- (UINavigationController *)navController {
if (!_navController) {
UIStoryboard *tempStoryboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
_navController = [tempStoryboard instantiateInitialViewController];
}
return _navController;
}
...
- (void)didReceiveMemoryWarning
{
if (![self.centerView isEqual:_navController]) {
_navController = nil;
}
}
迅速落实
var navController :UINavigationController? {
get {
// There is no assignment to the a variable and I can't check if the current value is nil or it recalls the get method and hence re-create it if it is nil.
let tempStoryboard = UIStoryboard(name: "Image", bundle: nil);
let tempNavController: AnyObject = tempStoryboard.instantiateInitialViewController();
return tempNavController as? UINavigationController;
}
}
...
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
if (!self.centerPanel.isEqual(navController)) {
self.navController = nil;
}
}
答
你错过了这件作品的是,在Objective-C,它创造了_navController
伊娃和setter你;在Swfit中,你需要自己创建这些。
一旦你有那些到位,斯威夫特您navController
属性可以看起来很相似,Objective-C的一个:
private var _navController: UINavigationController? = nil
var navController: UINavigationController! {
get {
if _navController == nil {
let tempStoryboard = UIStoryboard(name: "Image", bundle: nil);
_navController = tempStoryboard.instantiateInitialViewController() as? UINavigationController
}
return _navController
}
set {
_navController = newValue
}
}
注:我delcared navController
一个隐含解开UINavigationController
使之能设置为nil
,同时仍然可以访问,而不必每次都解开数值。虽然使用隐式解包类型可能会很危险,但在这种情况下可以使用(适当)。由于我们在吸气剂本身中检查了nil
,因此我们可以保证它总是会返回非nil
的值。此外,即使我们对从instantiateInitialViewController
返回的值使用了条件向下转换,但我们可以说从该函数返回的任何值为而不是 a UINavigationController
将是程序员错误,因此导致的崩溃将是合适的。
啊好的我不确定我是否缺少与伊娃命名有关的东西,或者现在是否完全消失。这似乎是你通常不会迅速做的事,除非你有类似于我的情况。感谢所有的信息,非常感谢! – DMCApps 2014-09-22 12:59:38
我实际上经常使用这种模式,它在Swift中只是不太自动。不久之前,当自动属性合成器还不是什么时候,你必须在Obj-C中做同样的事情:) – 2014-09-22 14:27:41
当我从ObjC切换时已经错过了一些东西 – 2015-10-20 07:30:42