Swift中如何获取TableView前3行数据并显示到外部Label
问题解决方法
快速修复当前报错
你遇到的问题是NSArray中的元素默认是Any类型,编译器无法识别它是UsersModel实例,因此不能直接访问name属性。只需在访问元素前强制转换为UsersModel即可,修改代码如下:
if feedItems.count >= 3 { lblFirstWinner.text = (feedItems[0] as! UsersModel).name // 第一名 lblSecondWinner.text = (feedItems[1] as! UsersModel).name // 第二名 lblThirdWinner.text = (feedItems[2] as! UsersModel).name // 第三名 }
将这段代码放到itemsDownloaded方法中,确保在数据加载完成后执行:
func itemsDownloaded(items: NSArray) { feedItems = items self.listTableView.reloadData() // 填充前三名Label if feedItems.count >= 3 { lblFirstWinner.text = (feedItems[0] as! UsersModel).name lblSecondWinner.text = (feedItems[1] as! UsersModel).name lblThirdWinner.text = (feedItems[2] as! UsersModel).name } }
更优的Swift类型安全改进
建议用Swift原生Array替代NSArray,从根源上避免类型转换的繁琐:
- 修改协议和
HomeModel中的类型定义:
protocol HomeModelProtocol: AnyObject { func itemsDownloaded(items: [UsersModel]) // 将NSArray替换为[UsersModel] } class HomeModel: NSObject, URLSessionDataDelegate { // ... 其他代码保持不变 func parseJSON(_ data:Data) { var jsonResult = [Any]() do{ jsonResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [Any] } catch let error as NSError { print(error) } var users = [UsersModel]() // 用Swift数组替代NSMutableArray for element in jsonResult { guard let jsonElement = element as? NSDictionary else { continue } let user = UsersModel() if let name = jsonElement["name"] as? String, let email = jsonElement["email"] as? String, let phoneNumber = jsonElement["phone"] as? String, let userImage = jsonElement["image"] as? String { user.name = name user.email = email user.phoneNumber = phoneNumber user.userImage = userImage users.append(user) } } DispatchQueue.main.async { self.delegate.itemsDownloaded(items: users) } } }
- 修改控制器中的
feedItems类型及相关方法:
var feedItems: [UsersModel] = [] // 替换NSArray为Swift数组 func itemsDownloaded(items: [UsersModel]) { feedItems = items self.listTableView.reloadData() if feedItems.count >= 3 { lblFirstWinner.text = feedItems[0].name lblSecondWinner.text = feedItems[1].name lblThirdWinner.text = feedItems[2].name } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cellIdentifier = "BasicCell" let myCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as! WinnerTableCell let item = feedItems[indexPath.row] // 无需强制转换 myCell.lbTextName?.text = item.name return myCell }
这种方式更符合Swift的类型安全特性,既能简化代码,也能降低运行时出错的概率。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

