出现错误:在初始化所有存储的属性之前,方法调用“getliveData”中使用了自我
Posted
技术标签:
【中文标题】出现错误:在初始化所有存储的属性之前,方法调用“getliveData”中使用了自我【英文标题】:Getting error: self' used in method call 'getliveData' before all stored properties are initialized 【发布时间】:2021-06-25 14:43:11 【问题描述】:我无法删除此错误。我之前使用过这个函数没有问题,甚至看到过这个结构完成的教程,编译器没有抱怨,但由于某种原因,这种情况一直在发生,我不知道为什么。我只是想取。来自 Firestore 的文档。
import SwiftUI
import Firebase
import Foundation
class LiveStream: ObservableObject
@Published var hptvlive: HPtvLiveData
init() getliveData()
func getliveData()
let db = Firestore.firestore()
let docRef = db.collection("HPtvLive").document("hptvlive")
docRef.getDocument (document, error) in
guard error == nil else
print("error", error ?? "")
return
if let document = document, document.exists
let data = document.data()
if let data = data
print("data", data)
self.hptvlive.title = data["title"] as? String ?? ""
self.hptvlive.upnextText = data["upnextText"] as? String ?? ""
self.hptvlive.description = data["description"] as? String ?? ""
struct HPtvLiveData
var title: String
var upnextText: String
var description: String
var thumbnail: URL
var poster: URL
【问题讨论】:
我之前用过这个功能没有问题。如果hptvlive
没有被初始化,我对此表示怀疑。您必须在 init
方法中执行此操作。这就是错误所说的,重复一个基本规则:在使用self
之前必须初始化所有存储的属性。
我试过了,它一直告诉我在范围内找不到 hptvlive
格式化你的代码,缩进很乱,可能大括号没有平衡好。
格式化,全选,然后Ctrl
+ i
与第一条评论相呼应,这段代码无法编译,如果有使用这种结构的教程,与此处显示的内容相比,缺少一个重要元素。您是否在@Published var hptvlive: HPtvLiveData
之后使用缺少初始化程序?还是应该是可选的?
【参考方案1】:
我认为你有两个问题:
您在异步回调中设置 hptvlive,因此当返回 init 时,该值仍未初始化,只有稍后调用 getDocument 回调时才会设置。
我不确定您应该如何使用@Published 信息。但是将整个对象 hptvlive 设置为发布,您不是在检查该结构内每个字段的更改,而是在寻找对该结构的引用。 如果这是你想要的,那么我会写: @Published var hptvlive:HPtvLiveData? = 无
这样你从一个对 nil 的引用开始,然后在其中设置一个值。
我认为更有可能的另一种选择(但同样取决于您的视图将如何使用该信息)是:
让 hptvlive = HPtvLiveData()
// instead of struct use:
class HPtvLiveData : ObservableObject
@Published var title: String = ""
@Published var upnextText: String = ""
@Published var description: String = ""
@Published var thumbnail: URL?
@Published var poster: URL?
// For easy tracking of set / not set yet
@Published var isDataAvailable = false
【讨论】:
感谢您,这实际上正是我在看到您的评论之前所做的,并且它使编译器满意,我只是将数据更改为可选(开始了解我做错了什么)。我现在唯一真正的问题是 Xcode 正在做这个奇怪的预构建/索引循环,所以我无法继续,直到我弄清楚如何阻止它这样做。但谢谢你。以上是关于出现错误:在初始化所有存储的属性之前,方法调用“getliveData”中使用了自我的主要内容,如果未能解决你的问题,请参考以下文章
出现错误“在初始化之前不能访问类型属性” - Laravel Livewire
在视图初始化之前调用视图控制器中的方法 - iPhone iOS 5 SDK
错误:无法在初始化之前调用自动完成的方法;试图调用方法“销毁”
未捕获的错误:在初始化之前无法调用可拖动的方法;试图调用方法“禁用”