Как сохранить массив словаря и отобразить его в виде коллекции в Swift 4 - PullRequest
0 голосов
/ 07 мая 2018

Я получаю данные из json, как массив словарей, и извлекаю их, используя структуру. Я создал структуру следующим образом: -

  struct Objects {
    var truckName : String!
    var truckCost : [String]!
}

var objectsArray = [Objects]()

И я получаю данные от сына, используя alamofire

 Alamofire.request("my url", method: .post, parameters: param, encoding: URLEncoding.default, headers: header).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            guard let json = response.result.value as? [String:Any] else{ return}
            print("Response \(json)")
            guard let response = json["response"] as? [String:Any] else{ return}
            print(response)

            for (key, value) in response {
                print("\(key) -> \(value)")
                self.objectsArray.append(Objects(truckName: key, truckCost: value as! String))
               // self.objectsArray.append(Objects(truckName: key))

            }
            guard let msg = json["msg"] as? String else { return}
            print(msg)
            break

        case .failure(_):
            print(response.result.error as Any)
            break

        }
        DispatchQueue.main.async {
            self.collectionView.reloadData()
        }

    }

}
   Displaying data on collectioView
       func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "requestCell", for: indexPath) as! RequestCollectionViewCell
    cell.cellName.text = objectsArray[indexPath.item].truckName
    cell.moneyLabel.text = objectsArray[indexPath.item].truckCost
    cell.cell_Img.layer.cornerRadius = 40
    cell.cell_Img.layer.masksToBounds = true
    return cell
}

Если я получаю только truckName, тогда все работает, и он печатает в collectionView, но когда я пытаюсь напечатать truckCost, выдается следующее сообщение об ошибке: - Невозможно привести значение типа '__NSCFNumber' (0x116bbe208 ) к NSArray (0x116bbef28) enter image description here

1 Ответ

0 голосов
/ 07 мая 2018

Вы пытаетесь привести Int к [String]

Измените [Строка] на Int в вашей структуре

struct Objects {
    var truckName : String!
    var truckCost : Int!
}

var objectsArray = [Objects]()

и в функции Alamofire;

self.objectsArray.append(Objects(truckName: key as! String, truckCost: value as! Int))

Также, где вы объявляете ячейку;

if let unwrappedCost = objectsArray[indexPath.item].truckCost{ 
cell.moneyLabel.text = String(describing: unwrappedCost) 
}else{ 
cell.moneyLabel.text = "0" //Your Value If It can't Find Cost in Class 
}
...