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

Why Swift disallows weak reference for non-optional type?

这不是纯粹的好奇,感觉我可能对Swift中的弱引用有些误解。

假设我从视图控制器创建一个 class 并将其引用传递给初始化程序:

class = MyClass(vc: self)

由于情节提要和 window 已经保留对此视图控制器的引用,因此 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 变量不是可选的。所以我不得不添加'!'到 viewController 声明并删除初始化程序,只留下看起来很不自然的 setViewController

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

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

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

不要将 viewController 声明为隐式展开(使用 !)。使它成为一个适当的可选(使用 ?)。