Properties Swift-延迟加载可在以后设置为零的属性

Properties Swift-延迟加载可在以后设置为零的属性,properties,swift,loading,lazy-evaluation,Properties,Swift,Loading,Lazy Evaluation,我正在寻找一种方法来延迟加载我的变量,但我希望以后能够将其设为零,然后在get上重新创建它。例如,在存在内存警告的情况下,我希望清除任何未使用的内容,然后在以后需要时重新创建它 以下是我将如何在Objective-C中实现这一点,以及我目前在swift中的解释。我不确定它是否保留了用于保持当前导航的变量 Obj-C实现 @property (strong, nonatomic, readwrite) UINavigationController *navController; ... - (

我正在寻找一种方法来延迟加载我的变量,但我希望以后能够将其设为零,然后在get上重新创建它。例如,在存在内存警告的情况下,我希望清除任何未使用的内容,然后在以后需要时重新创建它

以下是我将如何在Objective-C中实现这一点,以及我目前在swift中的解释。我不确定它是否保留了用于保持当前导航的变量

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;
    }
}
迅速实施

@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中做同样的事情:)