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将是程序员错误,因此导致的崩溃将是合适的。

+0

啊好的我不确定我是否缺少与伊娃命名有关的东西,或者现在是否完全消失。这似乎是你通常不会迅速做的事,除非你有类似于我的情况。感谢所有的信息,非常感谢! – DMCApps 2014-09-22 12:59:38

+0

我实际上经常使用这种模式,它在Swift中只是不太自动。不久之前,当自动属性合成器还不是什么时候,你必须在Obj-C中做同样的事情:) – 2014-09-22 14:27:41

+0

当我从ObjC切换时已经错过了一些东西 – 2015-10-20 07:30:42