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

问题描述 投票:2回答:1

这不是纯粹的好奇心,有一种感觉我可能会误解Swift中的弱引用。

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

class = MyClass(vc: self)

由于故事板和窗口已经保留了对此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
    }

    ...
}

但是,此代码会出现编译错误,因为viewController变量不是可选的。所以我不得不加'!' to viewController声明并删除初始化器,只留下看起来相当不自然的setViewController

不允许非可选弱数据背后的原因是什么?

swift optional weak-references
1个回答
5
投票

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

由于变量必须允许nil值,因此它必须是可选的。这就是不允许使用非可选弱变量的原因。

不要声明viewController被隐式解包(使用!)。使它成为一个合适的选项(使用?)。

© www.soinside.com 2019 - 2024. All rights reserved.