1
votes

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an error occurs. Just inside this function.

func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
    var dateForDot = dateFormatter.string(from: date)
        self.getScheduleDot(date: dateForDot)
    let dotArr = self.userDefaults.array(forKey: "arrForDotDisplay") as! [String]
        for dateString in dotArr {
            if dateForDot == dateString {
                return 1
            }
        }
    return 0
}

The details of the "getScheduleDot" method are as follows

func getScheduleDot(date: String) {
    self.db
        .collection("users")
        .document(fireAuthUID)
        .addSnapshotListener { (snapshot, error) in
        guard let document = snapshot else {
            print("erorr2 \(String(describing: error))")
            return
        }
        guard let data = document.data() else { return }
        self.teamIDFromFirebase = data["teamID"] as? String ?? ""

        self.db
            .collection("teams")
            .document(self.teamIDFromFirebase)
            .collection("schedule")
            .whereField("date_start", isEqualTo: date)
            .getDocuments() { (querySnapshot, err) in
            if err != nil {
                print("scheduleを取得できませんでした")
                return
            } else {
                var i = 0
                for document in querySnapshot!.documents {
                    let dataFromFirebase: [String : Any] = document.data()
                    let startDateFromFirebase = dataFromFirebase["date_start"] ?? ""
                    let endDateFromFirebase = dataFromFirebase["date_end"] ?? ""
                    self.dotDisplayArr.append(startDateFromFirebase as! String)
                    self.dotDisplayArr.append(endDateFromFirebase as! String)
                    i += 1
                }

                self.dotDisplayArr as NSArray
                self.userDefaults.removeObject(forKey: "arrForDotDisplay")
                self.userDefaults.set(self.dotDisplayArr, forKey: "arrForDotDisplay")
                self.userDefaults.synchronize()
            }
        }
    }
}

Although it was working normally until then, you will get such bugs after updating xcode. I would like to tell you the reason.

1
@Paulw11 I don't think that generic dupe target applies here. The actual issue here is that OP is using async Firebase functions and setting UserDefaults from the completion handler, but trying to access the set values from outside the completion handler - Dávid Pásztor

1 Answers

0
votes
let dotArr = self.userDefaults.array(forKey: "arrForDotDisplay") as! [String]

Check this I think there is nothing in userDefaults. wrap this logic into guard or work with as? [String] and check for nil manually