Swift 3:索引超出范围错误

时间:2016-10-13 15:52:15

标签: ios swift3

我是iOS新手。通过观看使用Swift 2编写的教程来完成项目。
当作者运行app而不是我的情况时,它可以工作。

的ViewController:

var books = [[String: AnyObject]]()

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    searchBar.delegate = self
}

扩展名

extension ViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "BookCell", for: indexPath)

        // error on this line
        if let volumeInfo = self.books[indexPath.row]["volumeInfo"] as? [String: AnyObject] {
            cell.textLabel?.text = volumeInfo["title"] as? String
            cell.detailTextLabel?.text = volumeInfo["subtitle"] as? String
        }

        return cell
    }
}

控制台输出:

enter image description here

请帮我确定原因。

2 个答案:

答案 0 :(得分:2)

我假设您的项目很多,但如果您的tableView中只有一个部分,这是默认的,则不应将indexPath.section用于您的图书字典。您应该使用indexPath.row,如下所示

改变 -

if let volumeInfo = self.books[indexPath.section]["volumeInfo"] as? [String: AnyObject]

到 -

if let volumeInfo = self.books[indexPath.row]["volumeInfo"] as? [String: AnyObject] {

答案 1 :(得分:2)

如果与数据源数组相关,则必须从books.count返回numberOfRowsInSection从不“硬编码”该值。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return books.count
}

PS:在Swift 3中,你应该使用[String:Any]而不是[String:AnyObject]