出现错误:在初始化所有存储的属性之前,方法调用“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

错误:无法在初始化之前调用自动完成的方法;试图调用方法“销毁”

未捕获的错误:在初始化之前无法调用可拖动的方法;试图调用方法“禁用”

从初始化程序返回而不初始化所有存储的属性错误 Firebase

未初始化从初始化程序返回的所有存储属性的错误[重复]