Properties Swift-延迟加载可在以后设置为零的属性
我正在寻找一种方法来延迟加载我的变量,但我希望以后能够将其设为零,然后在get上重新创建它。例如,在存在内存警告的情况下,我希望清除任何未使用的内容,然后在以后需要时重新创建它 以下是我将如何在Objective-C中实现这一点,以及我目前在swift中的解释。我不确定它是否保留了用于保持当前导航的变量 Obj-C实现Properties Swift-延迟加载可在以后设置为零的属性,properties,swift,loading,lazy-evaluation,Properties,Swift,Loading,Lazy Evaluation,我正在寻找一种方法来延迟加载我的变量,但我希望以后能够将其设为零,然后在get上重新创建它。例如,在存在内存警告的情况下,我希望清除任何未使用的内容,然后在以后需要时重新创建它 以下是我将如何在Objective-C中实现这一点,以及我目前在swift中的解释。我不确定它是否保留了用于保持当前导航的变量 Obj-C实现 @property (strong, nonatomic, readwrite) UINavigationController *navController; ... - (
@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;
}
}
迅速实施
@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中,它正在为您创建
\u navController
ivar和setter;在Swfit中,您需要自己创建这些
一旦这些设置到位,您在Swift中的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
}
}
注意:I将
navController
作为隐式展开的UINavigationController
设置为nil
,同时仍然可以访问,而无需每次展开值。虽然使用隐式展开类型可能很危险,但在这种情况下使用它是可以的(并且是合适的)。由于我们在getter本身中检查nil
,我们可以保证它总是返回一个非nil
值。此外,即使我们对从实例化initialviewcontroller
返回的值使用条件向下转换,我们可以说,从该函数返回的任何值,如果不是UINavigationController
,都将是一个程序员错误,由此产生的崩溃将是适当的。啊,好的,我不确定我是否遗漏了ivar的命名,或者它现在是否完全消失了。这似乎是你在swift中通常不会做的事情,除非你有类似的案例。感谢您提供的所有信息,非常感谢!实际上,我经常使用这种模式,只是在Swift中没有那么自动。不久前,当自动属性合成器还不是一个东西时,您必须在Obj-C中做同样的事情:)