这在Swift 5.0中是允许的:
class Person {
unowned var child: Person?
}
这得到this release notes的支持:
无主和无主(不安全)变量现在支持可选类型。 (47326769)
我完全理解Swift 4.2和之前的弱和无主之间的区别。但是,我不确定为什么Apple决定让unowned
成为optional
类型。即使在docs(这是Swift 5.0的文档)中,这个实施的'提案'(我在哪里可以找到那个提议添加可选的无主引用的动机?)没有更新,因为它说:
一个无主参考应该总是有一个值。因此,ARC永远不会将无主引用的值设置为nil,这意味着使用非可选类型定义无主引用。
以上不再适用。 Apple声明的唯一功能差异是,预期unowned
引用的生命周期与持有该引用的对象相同或更长。好吧,我很好奇这个的技术用途。
当我使用weak
参考与可选的unowned
参考时,它有什么区别?或者,当引用对象具有更长的生命周期时,应该使用可选的unowned
的唯一区别是什么?我希望还有更多......
您误解了发行说明以及语言变化的含义。
为什么Apple决定将无壳的可选类型
他们没有。你可以,而且通常会,仍然会说
unowned let owner : MyViewController
这里唯一的变化是无主变量可以是Optional,这在以前是非法的。这种变化可以解决一个烦人的边缘情况,就是这样。
以上不再适用
是的。事情与以前完全没有变化:
nil
。唯一改变的是,曾经存在一个额外的规则,即无主参考类型不能是可选的。这个规则现在已经消失了。
正如你正确指出的那样,如果无主引用类型是一个Optional,那么它必须是var
引用,而不是let
引用(因为如果你没有权力从nil
更改它,那么将它作为Optional是没有意义的到实际值,反之亦然)。
典型的用例与您自己提供的非常相似:
class Node {
unowned var parent: Node?
}
似乎有理由说这个节点可能有也可能没有父节点(因为它可能位于图的顶部),但是如果它确实有父节点,那么父节点应该是无主的(父节点应保留其子节点,但是孩子不应该保留其父母)。以前,唯一的说法就是使这个弱引用,这需要一些不必要的开销,并且是非常的,因为我们可以绝对保证如果一个节点有一个父节点,父节点将比子节点更长。现在,你可以说出你的意思,这通常是一件好事。