为什么Swift不允许对非可选类型使用弱引用?

cya*_*ide 2 weak-references optional swift

这并不是纯粹的好奇心,我可能会误解一些关于Swift中弱引用的东西。

假设我从View Controller创建一个类,并将其引用传递给初始化程序:

class = MyClass(vc: self)
Run Code Online (Sandbox Code Playgroud)

由于情节提要和窗口已经保留了对该View Controller的引用,因此MyClass对它的弱引用似乎是合乎逻辑的(出于类似原因,默认情况下,在IB中创建的所有引用都是弱的):

class MyClass: NSObject {
    private weak var viewController: UIViewController

    init(vc: UIViewController) {
       self.viewController = vc
       super.init
    }

    func setViewController(_ vc: UIViewController) {
       self.viewController = vc
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码会产生编译错误,因为viewController变量不是可选的。所以我必须加'!' 查看viewController声明并删除初始化程序,仅留下setViewController看起来不太自然的内容。

禁止非可选的弱数据的背后原因是什么?

rma*_*ddy 5

weak变量的确切定义是,变量不会增加对象的引用计数,更重要的是,对于您的问题,nil当释放引用的对象时,变量的值将自动设置为。

由于变量必须允许一个nil值,因此它必须是可选的。这就是为什么不允许非可选的弱变量。

不要声明viewController被隐式解包(使用!)。使其成为适当的可选(使用?)。