繁体   English   中英

是否可以根据 class 中的另一个变量初始化变量,该变量继承自 Swift 中的 UIViewController?

[英]Is it possible to initialize variable depending on another in class inheriting from UIViewController in Swift?

我正在尝试实现一个看似简单的事情:使用从 UIViewController 继承的同一个 class 中的另一个变量初始化常量变量。 我有 2 个可行的想法,但是有他们的问题,而且似乎不是最好的解决方案。

想法1 - 问题:不是恒定的

class MyViewController: UIViewController {
    let db = Firestore.firestore()
    let uid: String = UserDefaults.standard.string(forKey: "uid")!
    lazy var userDocRef = db.collection("users").document(uid)
}

想法2 - 问题:不是恒定的并且是可选的

class MyViewController: UIViewController {
    let db = Firestore.firestore()
    let uid: String = UserDefaults.standard.string(forKey: "uid")!
    var userDocRef: DocumentReference?
    override func viewDidLoad() {
        super.viewDidLoad()
        userDocRef = db.collection("users").document(uid)
    }
}

我认为应该可以通过覆盖init()来实现。 我已经尝试了几个我发现谷歌搜索的实现,但是我尝试过的每个人都给了我一些错误。 几个例子:

从这个答案。

convenience init() {
    self.init(nibName:nil, bundle:nil) // error: Argument passed to call that takes no arguments
    userDocRef = db.collection(K.Firestore.usersCollection).document(uid)
}

从这篇文章。

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)! // Property 'self.userDocRef' not initialized at super.init call
}

init() {
   super.init(nibName: nil, bundle: nil) // Property 'self.userDocRef' not initialized at super.init call
   userDocRef = db.collection(K.Firestore.usersCollection).document(uid)
}

我猜我要么错过了一些东西,要么那些已经过时了? 我很惊讶这样一个简单的任务,因为重写初始化程序是如此的麻烦。 正确的方法是什么?

您的第二次尝试非常接近。 您真的只是错过了必须遵循的这条规则:

class 中声明的所有属性必须在调用super.init之前进行初始化。

在您的第二次尝试中, userDocRef未在init(coder:)中初始化,而是在init()中的super.init调用之后初始化。

你应该这样写:

init() {
    userDocRef = db.collection(K.Firestore.usersCollection).document(uid)
    super.init(nibName: nil, bundle: nil)
}

required init?(coder: NSCoder) {
    userDocRef = db.collection(K.Firestore.usersCollection).document(uid)
    super.init(coder: coder)
}

我认为您无法摆脱此处的重复代码...您可以做的最好的事情是创建一个返回db.collection(K.Firestore.usersCollection).document(uid)static辅助方法,这意味着制作db static 也是如此,现在我想起来可能会更糟。

请注意,情节提要中的任何内容都将使用init(coder:)创建,因此如果您使用情节提要,请务必在此处正确执行初始化程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM