![](/img/trans.png)
[英]Swift - Inheriting UIViewController from a generic base class that is also a 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.