无法将“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

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

无法将 ReactiveUI 添加到 NUnit 测试项目