2017-10-11 67 views
1

我有以下字典,我將其放入數組中。無法將類型'Swift.Array <Any>'的值轉換爲'Swift.Dictionary <Swift.String,Any>'

//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]) 

在我的TableView

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中會告訴你馬上你有參數類型和預期的類型,是不是在運行的時候發現你的錯誤好得多之間的不匹配你的程序崩潰了。

+0

感謝有關枚舉和結構的詳細解釋,真的很感激。 –

0

這裏:

myGoalieInforamtionCell.fillTableView(with: [myShotArray]) 

你包裹在其它陣列的陣列,所以你得到你的陣列,而不是你的字典,當你訪問它來填充你的細胞。

應該僅僅是:

myGoalieInforamtionCell.fillTableView(with: myShotArray) 

在你應該聲明myShotArray[[String: Any]]和參數更改爲fillTableView最小的也有[[String: Any]]這樣編譯器會趕上這個錯誤。它也可以讓你刪除拋出你的錯誤的強制轉換。

你應該真的創建一個結構/類,並傳遞這些數組而不是字典。

相關問題