为什么 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
声明为隐式展开(使用 !
)。使它成为一个适当的可选(使用 ?
)。
这不是纯粹的好奇,感觉我可能对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
声明为隐式展开(使用 !
)。使它成为一个适当的可选(使用 ?
)。