Панель поиска в массиве вызовов TableView - PullRequest
0 голосов
/ 17 ноября 2018

Я не могу вызвать массив из Json, я получаю две ошибки.

Невозможно присвоить значение типа '[CoinModel]' для типа '[String]'

Невозможно присвоить значение типа 'CoinModel' для типа 'Строка?'

Где я делаю ошибки?

import UIKit
import Alamofire
import SwiftyJSON


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!

let URL_DATA = "https://api.coincap.io/v2/assets"

var coin = [CoinModel]()
var searchCoin = [String]()
var searching = false

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if searching {
        return searchCoin.count
    } else {
        return coin.count
    }

}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CoinTableViewCell


    tableView.backgroundColor = .clear
    cell.backgroundColor = .clear


    if searching{
        cell.nameLabel.text = searchCoin[indexPath.row]
    } else {
        cell.nameLabel.text = coin[indexPath.row]
    }


    let coindata: CoinModel
    coindata = coin[indexPath.row]


    cell.nameLabel.text = coindata.name
    cell.symbolLabel.text = coindata.symbol
    let priceFloat = (coindata.price as NSString).floatValue
    let costString = String(format:"%.3f", priceFloat)
    cell.priceLabel.text = "\(costString)"
    let percentFloat = (coindata.percent as NSString).floatValue
    let percentString = String(format:"%.2f", percentFloat)

    if percentFloat < 0 {
        cell.percentLabel.text = "\(percentString)%"
        cell.percentLabel.textColor = UIColor(hexString: "#F47E99")
    } else {
         cell.percentLabel.text = "+\(percentString)%"
         cell.percentLabel.textColor = UIColor(hexString: "#19984A")
    }




    return cell

}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    searchCoin =  coin.filter({$0.name.prefix(searchText.count) == searchText})
    searching = true
    tableView.reloadData()
}

func getCoinData() {
    Alamofire.request(URL_DATA).responseJSON { response in

        if let json = response.result.value as? [String: Any], let arr = json["data"] as? [[String: Any]] {
            let CoinArray: [[String: Any]] = arr

            for dict in CoinArray {
                if let name = dict["name"] as? String,
                    let symbol = dict["symbol"] as? String,
                    let price = dict["priceUsd"] as? String,
                    let percent = dict["changePercent24Hr"] as? String

                {

                    let coinnModal: CoinModel = CoinModel(name: name, symbol: symbol, price: price, percent: percent)
                    self.coin.append(coinnModal)


                }

                self.tableView.reloadData()
            }

        }
    }
}



override func viewDidLoad() {
    super.viewDidLoad()
    getCoinData()

 }


}

Я получаю сообщение об ошибке cell.nameLabel.text = coin[indexPath.row]

Невозможно присвоить значение типа 'CoinModel' типу 'String?'

, а также searchCoin = coin.filter({$0.name.prefix(searchText.count) == searchText})

Невозможно присвоить значениевведите «[CoinModel]» для ввода «[String]»

Модель:

import Foundation

class CoinModel {

var name: String
var symbol: String
var price: String
var percent: String

init(name: String, symbol: String, price: String, percent: String) {

    self.name = name
    self.symbol = symbol
    self.price = price
    self.percent = percent
 }


}

1 Ответ

0 голосов
/ 17 ноября 2018

Похоже, вы хотите присвоить имя CoinModel метке.

cell.nameLabel.text = coin[indexPath.row].name

А для отображения, если вам нужен массив из CoinModel имен, вам следует отобразить отфильтрованный результат.

searchCoin = coin.compactMap( {$0.name.prefix(searchText.count) == searchText ? $0.name: nil} )

Подсказка: Вы должны использовать собственные имена для описания своих переменных. Например, у вас есть массив CoinModel, который вы назвали coin, который вместо этого можно было бы назвать coins. Кроме того, я бы порекомендовал вам поддерживать единообразие при хранении источника данных. Один источник данных - это массив CoinModel с, а другой - массив String с. Вы должны иметь только один, предпочтительно CoinModel IMO.

...