【问题标题】:SwiftUI: What's 'Escaping closure captures mutating 'self' parameter' and how to fix itSwiftUI:什么是'转义闭包捕获变异'self'参数'以及如何修复它
【发布时间】:2020-04-21 22:46:49
【问题描述】:

我尝试将当前日期与我在 Firebase 上保存的日期进行比较。在比较之前,我将它们从时间戳转换为日期。如果相等,我想将bool1(变量)的值设置为true,以便稍后使用它来设置背景颜色。 通过这样做,我得到了错误:

转义闭包变异自参数。

代码如下:

struct RKDate1 {

    var date: Date

    let rkManager: RKManager1
    @State var bool1 = false
    var isDisabled: Bool = false
    var isToday: Bool = false
    var issafed: Bool = false
    var isSelected: Bool = false
    var isBetweenStartAndEnd: Bool = false

    init(date: Date, rkManager: RKManager1, isDisabled: Bool, isToday: Bool, isSelected: Bool, isBetweenStartAndEnd: Bool) {
        self.date = date
        self.rkManager = rkManager
        self.isDisabled = isDisabled

        self.isToday = isToday
        self.isSelected = isSelected
        self.isBetweenStartAndEnd = isBetweenStartAndEnd

        let db = Firestore.firestore()

        db.collection("Termin").order(by: "date").addSnapshotListener { (snap, err) in

            if err != nil{

                print((err?.localizedDescription)!)

                return
            }

            for i in snap!.documentChanges{

                let id = i.document.documentID

                let date1 = i.document.get("date") as! Timestamp

                let components = Calendar.current.dateComponents([.day,.month, .year], from: date1.dateValue())
                let components1 = Calendar.current.dateComponents([.day,.month, .year], from: date)
                let currentdate = Calendar.current.date(from: components1)
                let newdate = Calendar.current.date(from: components)

                if newdate == currentdate {
                    self.bool1 = true
                }
            }
        }
    }
}

【问题讨论】:

  • 我注意到 RKDate1 不是一个视图(没有 var body: some View),所以你不应该在这个结构中使用@State var bool1。即使您将其设为视图,在 init(...) 中执行您的 firestore 操作也不是一个好主意。

标签: firebase swiftui


【解决方案1】:

编辑: 似乎您不能再在转义闭包without removing @escaping 中改变结构,这在您的情况下是不可能的。您可能需要考虑将您的实现更改为一个类。


结构是不可变的。这意味着它们不能被突变。在您的情况下,您正在修改 self.bool1 = true 的值,这正在改变 self 的值。

~~更好的方法 (IMO) 是创建一个 mutating func 来执行您的 firebase 调用并更新变异函数中的值。~~

此外,您不应在模型中使用 State 属性包装器。它们只能在视图中使用。

【讨论】:

    【解决方案2】:

    感谢您的回复。我感谢你的努力。我尝试了一个变异函数,遗憾的是它也不起作用。我收到相同的错误消息。我不再使用国家财产了。我是一个初学者,不太确定我是否完全理解我可能做错了什么。

    mutating func finddates() {
    
    
          let db = Firestore.firestore()
    
                                db.collection("Termin").order(by: "date").addSnapshotListener { (snap, err) in
    
                                    if err != nil{
    
                                        print((err?.localizedDescription)!)
    
                                        return
                                    }
    
    
    
    
                                    for i in snap!.documentChanges{
    
    
                                      let id = i.document.documentID
    
    
                                            let date1 = i.document.get("date") as! Timestamp
    
    
    
                                       let components = Calendar.current.dateComponents([.day,.month, .year], from: date1.dateValue())
                                      let components1 = Calendar.current.dateComponents([.day,.month, .year], from: self.date)
                                        let currentdate = Calendar.current.date(from: components1)
                                       let newdate = Calendar.current.date(from: components)
    
                                        if newdate == currentdate {
                                          self.bool1 = true
                                        }
    
    
    
                           }
    
                       }
    
      }
    

    【讨论】:

    • 你尝试过使用类吗?
    • struct RKDate1 更改为 class RKDate1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多