无法将“Swift.Array<Any>”类型的值转换为“Swift.Dictionary<Swift.String, Any>”
Posted
技术标签:
【中文标题】无法将“Swift.Array<Any>”类型的值转换为“Swift.Dictionary<Swift.String, Any>”【英文标题】:Could not cast value of type 'Swift.Array<Any>' to 'Swift.Dictionary<Swift.String, Any>' 【发布时间】:2017-10-11 19:21:02 【问题描述】:我将以下字典放入数组中。
//Collections
var myShotArray = [Any]()
var myShotDictionary = [String: Any]()
myShotDictionary = ["shotnumber": myShotsOnNet, "location": shot as Any, "timeOfShot": Date(), "period": "1st", "result": "shot"]
myShotArray.append(myShotDictionary as AnyObject)
然后我将数组传递给我的 tableview
myGoalieInforamtionCell.fillTableView(with: [myShotArray])
在我的表格视图中
var myShotArray = [Any]()
func fillTableView(with array: [Any])
myShotArray = array
tableView.reloadData()
print("myShotArray \(myShotArray)")
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = Bundle.main.loadNibNamed("ShotInformationTableViewCell", owner: self, options: nil)?.first as! ShotInformationTableViewCell
let positionInArray = myShotArray[indexPath.row] as! [String : Any] //Could not cast value of type 'Swift.Array<Any>' (0x103991ac0) to 'Swift.Dictionary<Swift.String, Any>' (0x1039929b0).
cell.myGoalieShotInformationShotNumberLabel.text = positionInArray["shotnumber"]! as? String
return cell
为什么我会收到上述错误主题?
提前致谢。
【问题讨论】:
【参考方案1】:当您调用 myGoalieInforamtionCell.fillTableView
时,您传递的是 [myShotArray]
- 这些方括号意味着您已将 myShotArray
放入另一个数组中,因此您实际上传递给 fillTableView
的是 [[[String:Any]]]
- 一个数组数组字典。
您可以通过简单地删除这些括号来解决您的直接问题;
myGoalieInforamtionCell.fillTableView(with: myShotArray)
但是,您的Any
太多了。您应该利用 Swift 的强类型,这将避免此类错误。
我建议您使用Struct
而不是字典来存储您的数据,然后您就可以正确输入内容。比如:
enum Period
case first
case second
case third
case fourth
struct ShotInfo
let shotNumber: Int
let location: String // Not sure what this type should be
let timeOfShot: Date
let period: Period
let result: Bool
var myShotArray = [ShotInfo]()
let shot = ShotInfo(shotNumber: myShotsOnNet, location: shot, timeOfShot: Date(), period: .first, result: true
myShotArray.append(shot)
myGoalieInforamtionCell.fillTableView(with: myShotArray)
func fillTableView(with array: [ShotInfo])
myShotArray = array
tableView.reloadData()
print("myShotArray \(myShotArray)")
如果你有这个并且你错误地说fillTableView(with: [myShotArray])
Xcode 会立即告诉你参数类型和预期类型不匹配,这比在程序崩溃时在运行时发现错误要好得多。
【讨论】:
感谢 enum 和 struct 的详细解释,非常感谢。【参考方案2】:这里:
myGoalieInforamtionCell.fillTableView(with: [myShotArray])
您将数组包装在一个额外的数组中,因此当您访问它以填充您的单元格时,您得到的是数组而不是字典。
应该是:
myGoalieInforamtionCell.fillTableView(with: myShotArray)
至少您应该将myShotArray
声明为[[String: Any]]
并将参数更改为fillTableView
也为[[String: Any]]
,以便编译器能够捕捉到这个错误。它还允许您删除引发错误的强制转换。
您确实应该创建一个结构/类并传递一个数组而不是字典。
【讨论】:
以上是关于无法将“Swift.Array<Any>”类型的值转换为“Swift.Dictionary<Swift.String, Any>”的主要内容,如果未能解决你的问题,请参考以下文章
无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端
C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable
无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS