gpt4 book ai didi

ios - 如何在 Swift 中取消初始化惰性变量?

转载 作者:可可西里 更新时间:2023-11-01 00:23:33 25 4
gpt4 key购买 nike

我一直在阅读关于 Swift initilization 的内容最近,一种似乎有一些优点的解决方案是利用惰性变量来避免可选项的厄运和忧郁,尤其是在扩展 UIViewControllers 或沿这些思路的其他类时。考虑到这一点,我得到了如下代码:

final class MyViewController : UIViewController {
lazy private var myOtherViewController: MyOtherViewController = MyOtherViewController()

deinit {
// myOtherViewController = nil // Can't do this. Expression resolves to an unused l-value
}

override func viewDidLoad() {
super.viewDidLoad()
myOtherViewController.foo();
}
}

// elsewhere...
final class MyOtherViewController : UIViewController {
deinit {
print("Deinit!")
}
}

在此处的示例中,似乎 MyOtherViewControllerdeinit 方法似乎从未触发,但我也没有办法让 myOtherViewController 取消初始化。不允许将其设置为 nil。是否有我遗漏的东西强制 MyOtherViewController 保留?还是我只是对垃圾收集器不耐烦?

最佳答案

为此,您的惰性变量必须声明为可选,即使您打算在需要值时立即初始化它(即惰性)。

class MyObject {

func run() {
print( "MyObject :: run()" )
}

init() {
print( "MyObject :: init" )
}

deinit {
print( "MyObject :: deinit" )
}
}

class MyContext {
lazy var myObject:MyObject? = MyObject()
}

let myContext = MyContext()
myContext.myObject?.run() //< "MyObject :: init"
myContext.myObject = nil //< "MyObject :: deinit"

此外,我不同意“可选项的厄运和忧郁”的概念——人们只需要知道在众多可用技术中哪一种是最方便和实用的处理它们的方法,以及如何避免允许过多的状态排列存在于给定上下文中的可选值和非可选值的组合中。此外,可选项实际上正是您在这里想要的,因为您打算使它无效。使用可选值并不意味着在您初始化它之前,该值暂时为 nil,而是它可能在其生命周期的任何时刻为 nil,即使它是在声明时或任何其他时间预先定义的。如果避免可选值对您来说真的是那么重要,那么您必须退后一步并重新评估您的架构,以创造一种您不再需要取消初始化该值的情况。

关于ios - 如何在 Swift 中取消初始化惰性变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33135048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com