Я пытаюсь достичь, казалось бы, простой вещи: инициализировать постоянную переменную, используя другую из того же класса, которая наследуется от UIViewController. У меня было 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()
. Я перепробовал несколько реализаций, которые нашел Googling, но все, кого я пробовал, давали мне какую-то ошибку. Несколько примеров:
Из этого ответа.
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)
}
Я Угадай, я либо что-то упустил, или они устарели? Я удивлен такой простой задачей, поскольку переопределение инициализатора является такой проблемой. Как правильно это сделать?