2017-10-13 48 views
0

我試圖從Firebase數據庫中獲取數據,數據格式如下。Firebase iOS Swift致命錯誤:NSArray元素無法匹配Swift數組元素類型

{ 
    "chits": { 
    "Chit-1": { 
     "Bidders": [ 
     { 
      "bankAccNumber": "5555566966", 
      "bankIFSC": "GFHJJHHJ", 
      "bankName": "55666", 
      "bidderEmail": "[email protected]", 
      "bidderId": "Bidder-1", 
      "bidderName": "Venkat Desi", 
      "bidderPhone": "9999999999", 
      "checked": false, 
      "paymentType": 66555 
     }, 
     { 
      "bankAccNumber": "5555566966", 
      "bankIFSC": "GFHJJHHJ", 
      "bankName": "55666", 
      "bidderEmail": "[email protected]", 
      "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()}) 
     ] 
    } 

} 

然而,在視圖控制器我想從下面的代碼獲取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() 
      } 
     }) 

The fatal error only occurs while trying to access bidders array at print(self.chitsArray.first!.bidders) . But, the array count seems to be correct all the time.

回答

1

的問題是在你的ChitObject類,specifially這裏:

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

您將需要創建投標人的數組,並分配到投標人變量。循環訪問您從snapshotValue [「bidders」]獲得的數組,併爲每個值創建Bidders對象,並將其分配到Swift數組中。

我還沒有火力地堡workded但這樣的事情可能工作:

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 
     ] 
    } 

} 
+0

你的意思是說,我要爲每個項目的每個變量分配?你可以發表一個例子嗎?我可以得到一個明確的理解。 –

+0

@govindkumar:編輯答案。基本上你需要從snapshotValue [「bidders」]中獲得Array的價值。我沒有使用過Firebase,但可能是編輯工作。 –

+0

If條件總是失敗,導致空投標人數組 –

相關問題