数组索引超出范围

Posted

技术标签:

【中文标题】数组索引超出范围【英文标题】:Array index out of range 【发布时间】:2016-03-15 15:02:03 【问题描述】:

我已经成功构建了一个搜索功能,它可以在 detailviewcontroller 中搜索并显示 TableView 标题和副标题。在 detailviewcontroller 中有两个文本标签,一个用于标题,一个用于副标题。

在单元格中显示标题和副标题可以正常工作,包括在 detailviewcontroller 中点击和查看它们。但是在输入搜索功能时,应用程序崩溃,原因是:

致命错误: (lldb)

EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

这是我所有的代码:

 let quotes = [
   "Saying1",
   "Saying2",]//End

let persons = [
    "Name1",
    "Name2",

]//End 

var filteredQuotes = [String]()
var filteredPersons = [String]()
var resultSearchController = UISearchController()

    override func viewDidLoad() 
        super.viewDidLoad()

        self.resultSearchController = UISearchController(searchResultsController: nil)
        self.resultSearchController.searchResultsUpdater = self

        self.resultSearchController.dimsBackgroundDuringPresentation = false
        self.resultSearchController.searchBar.sizeToFit()

        self.tableView.tableHeaderView = self.resultSearchController.searchBar

        self.tableView.reloadData()


override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 1    

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows

    if self.resultSearchController.active
    
        return self.filteredQuotes.count
    
    else
    
        return self.quotes.count
         



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell?

    if self.resultSearchController.active
    
        cell!.textLabel?.text = self.filteredQuotes[indexPath.row]
        cell!.detailTextLabel?.text = self.filteredPersons[indexPath.row] //THE ERROR OCCURS HERE
    
    else
    
        cell!.textLabel?.text = self.quotes[indexPath.row]
        cell!.detailTextLabel?.text = self.persons[indexPath.row]
    

    return cell!


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "SendDataSegue" 
        if let destination = segue.destinationViewController as? SearchDetailViewController 

            let path = tableView.indexPathForSelectedRow
            let cell = tableView.cellForRowAtIndexPath(path!)
            destination.viaSegue = (cell?.textLabel?.text!)!
            destination.viaSeguePerson =(cell?.detailTextLabel?.text!)!
        
    


override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    _ = tableView.indexPathForSelectedRow!
    if let _ = tableView.cellForRowAtIndexPath(indexPath) 
        self.performSegueWithIdentifier("SendDataSegue", sender: self)
    




func updateSearchResultsForSearchController(searchController: UISearchController) 

    self.filteredQuotes.removeAll(keepCapacity: false)
    self.filteredPersons.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS [c] %@", searchController.searchBar.text!)

    let Quotesarray = (self.quotes as NSArray).filteredArrayUsingPredicate(searchPredicate)

    self.filteredQuotes = Quotesarray as! [String]

    let Personsarray = (self.persons as NSArray).filteredArrayUsingPredicate(searchPredicate)

    self.filteredPersons = Personsarray as! [String]

    self.tableView.reloadData()

【问题讨论】:

发布完整的崩溃日志并正确标记您的问题(删除xcode并添加swift)。 filteredPersons 是否包含您认为它包含的数据?你记录了内容吗?为什么将数据存储在 2 个单独的数组中?在我看来,这句话像是属于一个人的,对吧?为什么不创建一个名为Quote 的对象,其中包含一个字符串作为引号和一个字符串作为名称?然后你只需要一个名为quotes 的数组或其他东西。 什么可以保证QuotesarrayPersonsarray 包含相同数量(顺便说一下对应的)数据?例如:引用@“我认为;因此我在”等带有“René Descartes”的人,您搜索“Descartes”,QuotesarrayPersonsarray 应该有什么? 你能在 Github 上分享你的代码吗,我想我知道你的问题是什么,但我需要先看看你的完整代码 @***foe 谢谢,完整的崩溃日志是 () 致命错误: Array index out of range (lldb) 【参考方案1】:

正如@Larme 和@Fogmeister 所建议的那样,您可以使用结构化数组来改进这一点 - 这是您可以如何做这部分的示例。

定义一个结构来保存这样的数据

struct Quotes

    var person : String
    var quote  : String

然后像这样初始化它

let quotes = [Quotes(person: "name 1", quote: "saying 1"),
               Quotes(person: "name 2", quote: "saying 2")  ]

当然,您也可以初始化一个空数组,然后在从某个位置(数据库或用户输入)检索数据时附加数据

var quotes : [Quotes] = []

let quote1 = Quotes(person: "name 3", quote: "saying 3")        
quotes.append(quote1)

quotes.append(Quotes(person: "name 4", quote: "saying 4"))

【讨论】:

谢谢!但是我如何在代码的其他部分实现新数组呢? (例如 dequeueReusableCellWithIdentifier 和 updateSearchResultsForSearchController 函数)?我的意思是让一切都一起工作?非常感谢您的帮助@Russell 与您已经完全一样 - 但不是使用两个数组,而是有一个带有属性的数组 - 所以quotes[index].person和quotes[index].quote,而不是person[index] 和 quote[index] 我在 updateSearchResultsForSearchController 中收到关于 let Quotesarray = (self.quotes as NSArray).filteredArrayUsingPredicate(searchPredicate) 行的错误。上面写着“无法强制将 '[SearchTableViewController.Quotes]' 类型的值转换为 'NSArray' 类型”我为我的经验不足深表歉意,再次感谢您。 这里有一个很好的例子来解决这个问题 - ***.com/questions/31276848/… 问题是 self.quotes 不是一个简单的数组,它是一个结构体的自定义数组,但是看看前面的回答 我似乎无法弄清楚,我已尝试实现您链接的示例,但现在搜索功能根本不起作用 - 搜索时没有任何显示。 :(

以上是关于数组索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

Swift 致命错误:数组索引超出范围

如果数组索引超出范围,则尝试抛出范围错误(C++)

数组索引超出范围?如何?

从firebase删除时数组索引超出范围

获取“索引超出数组范围”异常

尽管表大于索引,但表索引超出范围