Ios 初始化变量:';自我';在初始化所有成员之前由闭包捕获

Ios 初始化变量:';自我';在初始化所有成员之前由闭包捕获,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我在初始化自定义类时遇到问题。我需要在初始化类时在一些数据上设置一个观察者,该类更新属性。最初,属性可以为空,这就是我在启动时设置它们的方式。但是,Xcode仍然抛出“在初始化所有成员之前由闭包捕获的“self”错误。下面是代码的简化版本 class Foo { init() { self.usersRef = ref.child("users") self.usersRef.observe(DataEventType.value, with: { (sn

我在初始化自定义类时遇到问题。我需要在初始化类时在一些数据上设置一个观察者,该类更新属性。最初,属性可以为空,这就是我在启动时设置它们的方式。但是,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]

}
以确保在回调之前进行初始化

我似乎只需要给出属性的初始值,但事实并非如此。我不希望在初始化后调用另一个函数来设置这些处理程序

感谢您的帮助

尝试使用此块

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

            self.users = users
        })


你在哪里初始化
usersRef
变量?@Vyacheslav谢谢,我在问题中漏掉了它,修复了它。我在搜索解决方案时看到了
[无主自我]
,但我不完全理解它的用途。据我所知,这是在创建一个弱引用?这会不会产生我在错误检查中应该注意的其他问题?@JustinOroz我在使用这些包装器时没有遇到太大的问题谢谢,它编译得很好,而且我看不到任何来自较弱参考的问题,所以这非常有效!我会将其标记为已接受,谢谢。基本上,一个强大的自我会增加保留计数,因此它在存在时总是指向自己,从而创建一个保留周期。这就是为什么你想要一个弱引用
{ [weak self] (snapshot) in
            // snapshot error checking
            // users is [String]

            self?.users = users
        })