Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Swift不允许非可选类型的弱引用?_Swift_Optional_Weak References - Fatal编程技术网

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

为什么Swift不允许非可选类型的弱引用?,swift,optional,weak-references,Swift,Optional,Weak References,这不是纯粹的好奇,有一种感觉,我可能会误解Swift中的弱引用 假设我从视图控制器创建了一个类,并将其引用传递给初始化器: class = MyClass(vc: self) 由于故事板和窗口已经保留了对此视图控制器的引用,因此MyClass对它的弱引用似乎是合乎逻辑的(出于类似的原因,在IB中创建的所有引用默认都是弱引用): 然而,这段代码给出了编译错误,因为viewController变量不是可选的。所以我不得不加上“!”要查看控制器声明并删除初始化器,只留下看起来很不自然的setView

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

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

class = MyClass(vc: self)
由于故事板和窗口已经保留了对此视图控制器的引用,因此MyClass对它的弱引用似乎是合乎逻辑的(出于类似的原因,在IB中创建的所有引用默认都是弱引用):

然而,这段代码给出了编译错误,因为viewController变量不是可选的。所以我不得不加上“!”要查看控制器声明并删除初始化器,只留下看起来很不自然的
setViewController


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

弱变量的定义是,该变量不会增加对象的引用计数,更重要的是,对于您的问题,当引用对象被解除分配时,该变量的值将自动设置为
nil

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


不要将
viewController
声明为隐式展开(使用
)。使其成为适当的可选(使用
)。

问题不是什么是弱类型,或者如何避免编译错误。问题是为什么不允许弱可选类型。我相信,我已经非常清楚地说明了这一点。一个提议,将“!”改为“?”应该不会有任何区别,除了需要一直显式地打开viewController。我的回答特别解释了为什么弱变量必须是可选的。简而言之,因为只有一个可选变量可以是nil,而一个弱变量可以是nil!是错误的,因为这样的变量永远不应该为nil。好吧,非可选变量不能设置为nil,所以它的引用计数永远不会变为0。这表明标准参考计数方法不适用于非可选类型。将它标记为一个答案,尽管它提出了更多的问题:)好消息是,我可以安全地使用非可选类型,而不用担心造成死锁。1)“由于故事板和窗口已经保留了对此视图控制器的引用,MyClass对它的弱引用似乎是合乎逻辑的”不,这不是一个好理由。如果对象在vc上没有所有权关系,则应使用弱引用,以阻止保留循环。2) “出于类似的原因,默认情况下IB中创建的所有引用都是弱引用”,如今,简单地使用强引用是首选。3) 当引用
viewController
时,当对它的强引用过期时,您希望发生什么?Alexander:1)“如果您的对象在vc上没有所有权关系,您应该使用弱引用”。事实上,MyClass并不拥有VC;故事板才是它的主人。因此,弱引用应该是正确的Alexander:2)如果首选强引用,为什么IB默认采用弱引用?纯粹怀旧?:)正如您所提到的,弱引用有助于阻止保留循环。现代Java不使用引用计数,因此它不提供弱引用。相反,斯威夫特使用引用计数,因此有时需要弱引用。亚历山大3)你能解释一下“强引用即将过期”的含义吗?1)根据你的推理,一个对象只能存在一个强引用。事实并非如此。如果您需要一个对象的有保证的生命周期,您可以使用强引用。
class MyClass: NSObject {
    private weak var viewController: UIViewController

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

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

    ...
}