无法将'__NSDictionaryM'(0x1111152b0)类型的值转换为'FIRDataSnapshot'Firebase Swift 3

问题描述 投票:0回答:1

我试图从Firebase数据库中读取嵌套数据结构,但是当[String:AnyObject]类型的对象可能为nil时,我不知道如何管理这种情况。 当调用readFeesCleaner(callback_)时,它会抛出错误。

  func readFeesCleaner(callback: @escaping ((_ feesCleaner: FeesCleaner) -> Void)) {

 dbRef.child("FeesCleaner").child(self.uidOfTextField!).observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in

        guard !(snapshot.value is NSNull) else {
            return
        }

       //throws error: signal SIGABRTCould not cast value of type '__NSDictionaryM' (0x1111152b0) to 'FIRDataSnapshot' (0x10ef16d18).
            let feesCleanersReceived = FeesCleaner(snapshot: (snapshot.value)! as! FIRDataSnapshot)
                callback(feesCleanersReceived)

    }) { (error:Error) in
        print(#line, "\(error.localizedDescription)")
    }
 } 


struct FeesCleaner {

   var outstandingFees: AnyObject!
   var timeStampFeesSaved: [String:AnyObject]!
   var backgroundCheck: AnyObject!

    init(
       outstandingFees: AnyObject? = nil, //value might not exist when reading
       timeStampFeesSaved: [String:AnyObject]? = nil,// value might not exist when reading
       backgroundCheck: AnyObject) {

       self.outstandingFees = outstandingFees
       self.timeStampFeesSaved = timeStampFeesSaved
       self.backgroundCheck = backgroundCheck   
  }//end of init

    //read data here
     [full struct data here][1]
      https://gist.github.com/bibscy/dc48f7107459379e045a50fdbbc35335


}//end of struct
firebase swift3 firebase-realtime-database
1个回答
1
投票

这里有很多问题。第一:

当[String:AnyObject]类型的对象可能为nil时,如何管理大小写。

您已使用先前的声明处理了这一点,并指出您也可以添加

if snapshot.exists == false {return}

第二:你必须正确处理选项 - 如果var可能是零,你需要代码来处理这种情况而不是通过它。如果你强行打开一个可选项,你基本上就是说它肯定永远不会是零,所以基本上不要这样做。

一个修复可能是简单地将快照作为DataSnapshot传递,然后一次拉出一个属性;如果它们存在,则指定它们,如果未设置为0或nil或其他占位符。

在Firebase闭包内有类似的东西:

let feesCleanersReceived = FeesCleaner(withSnapshot: snapshot)

然后你的结构如下:注意我们正在利用零合并算子,??

struct FeesCleanerStruct {
    var outstandingFees: String?
    var timeStampFeesSaved: String?

    init(withSnapshot: DataSnapshot) {
        let dict = withSnapshot.value as! [String: Any]
        self.outstandingFees = dict["outstandingFees"] as? String ?? "0.0"
        self.timeStampFeesSaved = dict["timeStampFeesSaved"] as? String ?? "0"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.