簡體   English   中英

Firebase iOS Swift致命錯誤:NSArray元素與Swift Array元素類型不匹配

[英]Firebase iOS Swift fatal error: NSArray element failed to match the Swift Array Element type

我正在嘗試從Firebase數據庫獲取數據,數據格式如下。

{
  "chits": {
    "Chit-1": {
      "Bidders": [
        {
          "bankAccNumber": "5555566966",
          "bankIFSC": "GFHJJHHJ",
          "bankName": "55666",
          "bidderEmail": "desi@venkat.co.in",
          "bidderId": "Bidder-1",
          "bidderName": "Venkat Desi",
          "bidderPhone": "9999999999",
          "checked": false,
          "paymentType": 66555
        },
        {
          "bankAccNumber": "5555566966",
          "bankIFSC": "GFHJJHHJ",
          "bankName": "55666",
          "bidderEmail": "desi@venkat.co.in",
          "bidderId": "Bidder-2",
          "bidderName": "Venkat Desi",
          "bidderPhone": "9999999999",
          "checked": false,
          "paymentType": 66555
        }
      ],
      "chitId": "Chit-1",
      "chitName": "ABC1",
      "chitTotalValue": 240000,
      "endDate": "11/10/2018",
      "monthlyShare": 1000,
      "startDate": "11/10/2017",
      "totalMonths": 12
    }
  }
}

根據上面的JSON,我創建了模型

Bidder.swift

    class Bidder {

    var bidderId: Int
    var bidderName: String
    var bidderEmail: String
    var bidderPhone : String
    var modeOfPayment: Int
    var bidderBankName: String
    var bidderBankAcno: String
    var bidderIfscCode: String
    var paymentArray : [[String:String]]?
    var chitrefArray : [String]?
    var ref: FIRDatabaseReference?

    init(bidderId: Int, bidderName: String,bidderEmail: String, bidderPhone: String, modeOfPayment: Int, bidderBankName: String, bidderBankAcno: String, bidderIfscCode: String,paymentArray:  [[String:String]], chitrefArray: [String]) {
        self.bidderId = bidderId
        self.bidderName = bidderName
        self.bidderEmail = bidderEmail
        self.bidderPhone = bidderPhone
        self.modeOfPayment = modeOfPayment
        self.bidderBankName = bidderBankName
        self.bidderBankAcno = bidderBankAcno
        self.bidderIfscCode = bidderIfscCode
        self.paymentArray = paymentArray
        self.chitrefArray = chitrefArray
        self.ref = nil
    }

    init(snapshot: FIRDataSnapshot) {
        let snapshotValue = snapshot.value as! [String: AnyObject]
        bidderId = snapshotValue["bidderId"] as! Int
        bidderName = snapshotValue["bidderName"] as! String
        bidderEmail = snapshotValue["bidderEmail"] as! String
        bidderPhone = snapshotValue["bidderPhone"] as! String
        modeOfPayment = snapshotValue["modeOfPayment"] as! Int
        bidderBankName = snapshotValue["bidderBankName"] as! String
        bidderBankAcno = snapshotValue["bidderBankAcno"] as! String
        bidderIfscCode = snapshotValue["bidderIfscCode"] as! String
        paymentArray = snapshotValue["paymentArray"] as? [[String : String]]
        chitrefArray = snapshotValue["chitrefArray"] as? [String]
        ref = snapshot.ref
    }

    func toAnyObject() -> Any {
        return [
            "bidderId" : bidderId,
            "bidderName" : bidderName,
            "bidderEmail": bidderEmail,
            "bidderPhone": bidderPhone,
            "modeOfPayment": modeOfPayment,
            "bidderBankName":bidderBankName,
            "bidderBankAcno": bidderBankAcno,
            "bidderIfscCode":bidderIfscCode,
            "paymentArray": paymentArray as Any,
            "chitrefArray" : chitrefArray as Any
        ]
    }

}

ChitObject.swift

class ChitObject {

    var chitId : Int
    var chitName: String
    var startDate: String
    var endDate : String
    var chitTotalAmt: Int
    var chitTotalMonths: Int
    var bidders: [Bidder]
    var ref: FIRDatabaseReference?

    init(chitId: Int,chitName: String, startDate: String, endDate: String, chitTotalAmt: Int, chitTotalMonths: Int, bidders: [Bidder]) {
        self.chitId = chitId
        self.chitName = chitName
        self.startDate = startDate
        self.endDate = endDate
        self.chitTotalAmt = chitTotalAmt
        self.chitTotalMonths = chitTotalMonths
        self.bidders = bidders 
        self.ref = nil
    }

    init(snapshot: FIRDataSnapshot) {
        let snapshotValue = snapshot.value as! [String: AnyObject]
        chitId = snapshotValue["chitId"] as! Int
        chitName = snapshotValue["chitName"] as! String
        startDate = snapshotValue["startDate"] as! String
        endDate = snapshotValue["endDate"] as! String
        chitTotalAmt = snapshotValue["chitTotalAmt"] as! Int
        chitTotalMonths = snapshotValue["chitTotalMonths"] as! Int
        bidders = snapshotValue["bidders"] as! [Bidder]
        ref = snapshot.ref
    }

    func toAnyObject() -> Dictionary<String, Any>
    {
        return [
            "chitId" : chitId,
            "chitName": chitName,
            "startDate": startDate,
            "endDate": endDate,
            "chitTotalAmt":chitTotalAmt,
            "chitTotalMonths": chitTotalMonths,
            "bidders":bidders.map({$0.toAnyObject()})
        ]
    }

}

但是,在Viewcontroller中,我試圖從下面的代碼中獲取biddersList

var chitsArray = [ChitObject]()
 ChitUtils.chitRef.queryOrdered(byChild: "chitId").observe(.value, with: { snapshot in
            if snapshot.childrenCount > 0
            {
                self.chitsArray.removeAll()
                for item in snapshot.children
                {
                    let chitItem = ChitObject(snapshot: item as! FIRDataSnapshot)
                    self.chitsArray.append(chitItem)
                }
                    self.chitsArray = self.chitsArray.reversed()
                    print(self.chitsArray.first!.bidders)
                    ChitUtils.lastChitId = (self.chitsArray.first?.chitId)! + 1
                    self.chitsTableView.reloadData()
            }
        })

致命錯誤僅在嘗試訪問print(self.chitsArray.first!.bidders) 數組時發生。 但是,數組計數似乎一直都是正確的。

問題在您的ChitObject類中,具體在這里:

bidders = snapshotValue["bidders"] as! [Bidder]

您需要創建一個競標者數組,並將其分配給bidders變量。 循環遍歷從snapshotValue [“ bidders”]獲得的數組,並為每個值創建Bidders對象,並將其分配給Swift數組。

我尚未使用Firebase,但類似的方法可能有效:

init(snapshot: FIRDataSnapshot) {
    let snapshotValue = snapshot.value as! [String: AnyObject]
    chitId = snapshotValue["chitId"] as! Int
    chitName = snapshotValue["chitName"] as! String
    startDate = snapshotValue["startDate"] as! String
    endDate = snapshotValue["endDate"] as! String
    chitTotalAmt = snapshotValue["chitTotalAmt"] as! Int
    chitTotalMonths = snapshotValue["chitTotalMonths"] as! Int
    if let biddersArray = snapshotValue["bidders"] as? [[String:Any]] {
        bidders = biddersArray.flatMap{Bidder(dict:$0)}
    }
    ref = snapshot.ref
}

編輯:

class Bidder {

    var bidderId: Int
    var bidderName: String
    var bidderEmail: String
    var bidderPhone : String
    var modeOfPayment: Int
    var bidderBankName: String
    var bidderBankAcno: String
    var bidderIfscCode: String
    var paymentArray : [[String:String]]?
    var chitrefArray : [String]?
    var ref: FIRDatabaseReference?

    convenience init?(dict:[String:Any]) {
        guard let bidderId = dict["bidderId"] as? Int, let bidderName = dict["bidderName"] as? String, let bidderEmail = dict["bidderEmail"] as? String, let bidderPhone = dict["bidderPhone"] as? String, let modeOfPayment = dict["paymentType"] as? Int, let bidderBankName = dict["bankName"] as? String, let bidderBankAcno = dict["bankAccNumber"] as? String, let bidderIfscCode = dict["bankIFSC"] as? String else {
            return nil
        }
        self.init(bidderId: bidderId, bidderName: bidderName, bidderEmail: bidderEmail, bidderPhone: bidderPhone, modeOfPayment: modeOfPayment, bidderBankName: bidderBankName, bidderBankAcno: bidderBankAcno, bidderIfscCode: bidderIfscCode, paymentArray: [[]], chitrefArray: [])
    }

    init(bidderId: Int, bidderName: String,bidderEmail: String, bidderPhone: String, modeOfPayment: Int, bidderBankName: String, bidderBankAcno: String, bidderIfscCode: String,paymentArray:  [[String:String]], chitrefArray: [String]) {
        self.bidderId = bidderId
        self.bidderName = bidderName
        self.bidderEmail = bidderEmail
        self.bidderPhone = bidderPhone
        self.modeOfPayment = modeOfPayment
        self.bidderBankName = bidderBankName
        self.bidderBankAcno = bidderBankAcno
        self.bidderIfscCode = bidderIfscCode
        self.paymentArray = paymentArray
        self.chitrefArray = chitrefArray
        self.ref = nil
    }

    init(snapshot: FIRDataSnapshot) {
        let snapshotValue = snapshot.value as! [String: AnyObject]
        bidderId = snapshotValue["bidderId"] as! Int
        bidderName = snapshotValue["bidderName"] as! String
        bidderEmail = snapshotValue["bidderEmail"] as! String
        bidderPhone = snapshotValue["bidderPhone"] as! String
        modeOfPayment = snapshotValue["modeOfPayment"] as! Int
        bidderBankName = snapshotValue["bidderBankName"] as! String
        bidderBankAcno = snapshotValue["bidderBankAcno"] as! String
        bidderIfscCode = snapshotValue["bidderIfscCode"] as! String
        paymentArray = snapshotValue["paymentArray"] as? [[String : String]]
        chitrefArray = snapshotValue["chitrefArray"] as? [String]
        ref = snapshot.ref
    }

    func toAnyObject() -> Any {
        return [
            "bidderId" : bidderId,
            "bidderName" : bidderName,
            "bidderEmail": bidderEmail,
            "bidderPhone": bidderPhone,
            "modeOfPayment": modeOfPayment,
            "bidderBankName":bidderBankName,
            "bidderBankAcno": bidderBankAcno,
            "bidderIfscCode":bidderIfscCode,
            "paymentArray": paymentArray as Any,
            "chitrefArray" : chitrefArray as Any
        ]
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM