ios - TableView中的搜索栏无法调用数组
问题描述
我不能从 Json 调用数组,我得到两点错误。
无法将“[CoinModel]”类型的值分配给“[String]”类型
无法将“CoinModel”类型的值分配给“String”类型?
我在哪里犯错?
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
}
}
解决方案
似乎您想将 的名称分配给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
s 数组,而另一个是一个String
s 数组。你应该只有一个,最好是CoinModel
imo。
推荐阅读
- python - 多项式特征变换
- c - 创建子进程时出现此输出的原因是什么?
- javascript - 调平系统进度条
- php - 如何在php中使用rest api向followupboss发送行动计划
- python - 使用 python 烧瓶的统一资源标识符验证
- neo4j - 在 Neo4j 中添加随机关系只使用单个节点
- firebase - 安装firebase包后运行“ionic cordova build android”时出错。任务':app:compileDebugJavaWithJavac'的执行失败
- javascript - JS对象字面量“new”中回调函数的范围
- android - 将项目添加到列表时的文字参数警告
- c# - 在虚拟桌面中使用 C# System.Diagnostics.Process 启动进程