初始化变量:在所有成员初始化之前由闭包捕获的“自我”

Posted

技术标签:

【中文标题】初始化变量:在所有成员初始化之前由闭包捕获的“自我”【英文标题】:Initialized variable: 'self' captured by a closure before all members were initialized 【发布时间】:2017-06-15 07:01:43 【问题描述】:

我在初始化自定义类时遇到问题。当类初始化更新属性时,我需要在一些数据上设置一个观察者。最初,属性可以为空,这就是我在启动时设置它们的方式。但是,Xcode 仍然会抛出“在所有成员初始化之前由闭包捕获的'self'”错误。这是代码的简化版本。

class Foo 
    init() 
        self.usersRef = ref.child("users")
        self.usersRef.observe(DataEventType.value, with:  (snapshot) in
            // snapshot error checking
            // users is [String]

            self.users = users
        )
    

    private var usersRef: DatabaseReference
    private(set) var users: [String] = []


我也试过了

class Foo 
    init() 
        self.users = [String]()
        self.usersRef = ref.child("users")
        self.usersRef.observe(DataEventType.value, with:  (snapshot) in
            // snapshot error checking
            // users is [String]

            self.users = users
        )
    

    private var usersRef: DatabaseReference
    private(set) var users: [String]


确保在回调之前初始化。

From this question 似乎我只需要给属性初始值,但似乎并非如此。我宁愿在初始化后不必调用另一个函数来设置这些处理程序。

感谢您的帮助

【问题讨论】:

你在哪里初始化usersRef变量? @Vyacheslav 谢谢,我在问题中错过了这个问题,已修复。 【参考方案1】:

尝试使用这个块

  [unowned self] (snapshot) in
            // snapshot error checking
            // users is [String]

            self.users = users
        )

 [weak self] (snapshot) in
            // snapshot error checking
            // users is [String]

            self?.users = users
        )

【讨论】:

我在寻找解决方案时看到了[unowned self],但我并没有完全理解它的用途。据我了解,它正在创建一个弱引用?这会产生我在错误检查中应该注意的其他可能问题吗? @JustinOroz 我在使用这些包装器时没有遇到大问题 谢谢,它编译得很好,而且我看不到任何由较弱的引用引起的问题,所以这很好用!我会将其标记为已接受,谢谢。 基本上,一个强大的 self 会添加到保留计数中,因此它会在存在时始终指向自身,从而创建一个保留循环。这就是为什么你想要(ed)一个弱参考

以上是关于初始化变量:在所有成员初始化之前由闭包捕获的“自我”的主要内容,如果未能解决你的问题,请参考以下文章

在初始化之前由闭包捕获的变量'isVericated' - Swift

'self'由关闭错误捕获&&,||操作者

由闭包错误自我捕获

C#由变量捕获引起对闭包的思考

不能在属性初始化器中使用实例成员“pdfName”;属性初始化程序在“自我”可用之前运行

MKCoordinateSpan中的错误,表示在自我可用之前运行