Ios 编译器在尝试删除所有快照侦听器时发现nil

Ios 编译器在尝试删除所有快照侦听器时发现nil,ios,swift,firebase,google-cloud-firestore,swiftui,Ios,Swift,Firebase,Google Cloud Firestore,Swiftui,我的应用程序中有一个注销功能,我想删除应用程序中使用的所有侦听器。为此,我使用一个可观察对象类来管理侦听器 class ListenersManager: ObservableObject{ @Published var listeners: [ListenerRegistration?] = [] func removeAllListeners(){ for i in listeners{ if i == nil{}

我的应用程序中有一个注销功能,我想删除应用程序中使用的所有侦听器。为此,我使用一个可观察对象类来管理侦听器

class ListenersManager: ObservableObject{

@Published var listeners: [ListenerRegistration?] = []


func removeAllListeners(){
    
    for i in listeners{
       
        if i == nil{}
        
        else{
        i!.remove()
        }
    }
}
}

然后我将其作为environmentObject注入应用程序

这就是我初始化侦听器并将它们添加到listenersManager的方式

    @EnvironmentObject var listenersManager: ListenersManager
    @State var driversCollListener: ListenerRegistration?

    .onAppear(perform: {

        listenersManager.listeners.append(driversCollListener)

     driversCollListener = db.collection("adminData").document(email).collection("drivers").whereField("cv", isEqualTo: 1).addSnapshotListener { (snapshot, err) in
        if err != nil{fatalError("Could not extract admin's drivers data")}

            if driversCollListener != nil{
        
        for driver in snapshot!.documents{
            
            if myDrivers.contains("\(driver.documentID)"){
                
            }else{
            myDrivers.append(driver.documentID)
                print(myDrivers)
           
            }
        }
                
            }
            else{}
    
    
    }
   }
这就是我调用删除所有侦听器的地方

                Button(action: {
                
                listenersManager.removeAllListeners()
                
                try? auth.signOut()
                navStack.pop(to: .root)
                
            }, label: {
                Text("Sign Out")
                    .font(Font.custom("Roboto-Light", size: 14))
                
            })
但是,这是单击“注销”按钮时出现的错误

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

您应该始终尝试消除Swift中的强制操作(展开、向下投射和尝试);每次你使用!要强迫别人做某事,你得冒着撞车的危险。我不是说你不应该使用这些操作,但不要简单地添加一个!以满足编译器的要求。考虑如何安全地完成操作

在代码中,您可以轻松消除强制展开:

func removeAllListeners(){
    
    for i in listeners{
       i?.remove()
    }
}
具有可选元素类型的数组也没有多大意义;如果元素为
nil
,则首先不要将其添加到数组中,因此请使用

@Published var listeners: [ListenerRegistration] = []

func removeAllListeners(){
    
    for listener in listeners{
       listener.remove()
    }
}

不要使用
如果变量为
nil
,它将崩溃-您可以简单地说
i?.remove()
。类似地,在快照?文档中为驱动程序设置
??[]
此外,一系列选项也没有多大意义。您应该声明
@Published var listeners:[ListenerRegistration]=[]
,如果侦听器为nil,则不存储它。我不知道stackoverflow为什么不推荐感谢他人。非常感谢。你是个救生员@paulw11在评论中感谢某人是完全可以的,顺便说一句,不客气。建议不要在你的问题中包含“谢谢”,因为它只是额外的单词。@Paulw11这是一个很好的观察结果,也是一个正确的编码解决方案。你能把它作为答案贴出来吗?
@Published var listeners: [ListenerRegistration] = []

func removeAllListeners(){
    
    for listener in listeners{
       listener.remove()
    }
}