我正在尝试为我的表格视图创建搜索功能,但是当我在文本字段中输入第二个字符时,该功能崩溃了。 我可以输入第一个字符,删除它,然后键入一个新字符,它不会崩溃。
我的错误说:
致命错误:无法递增endIndex
我的代码如下:
func textFieldDidChange(textField: UITextField){
self.loadSearchData(textField.text)
}
func loadSearchData(searchString:String){
var arrayOfSearches: [String] = []
let index = count(searchString)
for company in self.companies{
let searchIndex = advance(company.startIndex, index)
if searchString == company.substringToIndex(searchIndex){
arrayOfSearches.append(company)
}
}
self.companiesToDisplay = arrayOfSearches
self.companiesTV.reloadData()
}
其中companiesToDisplay
是我的表格视图显示的数组。
我知道错误在我的let searchIndex = advance(company.startIndex, index)
行,但我不知道为什么会造成错误。
任何有关如何解决此问题的建议都将受到赞赏。
答案 0 :(得分:2)
let searchIndex = advance(company.startIndex, index)
如果index
大于字符数,则在运行时失败
在字符串company
中。你可以用
let searchIndex = advance(company.startIndex, index, company.endIndex)
相反,它将起始索引增加index
个位置,但不超出字符串的结尾。
更简单的解决方案是使用hasPrefix
:
for company in self.companies {
if company.hasPrefix(searchString) {
arrayOfSearches.append(company)
}
}
或者使用具有不区分大小写搜索选项的rangeOfString
:
for company in self.companies {
if company.rangeOfString(searchString, options: .CaseInsensitiveSearch | .AnchoredSearch) != nil {
arrayOfSearches.append(company)
}
}
答案 1 :(得分:1)
一种可能的解决方案是用这个替换你的for
循环:
for company in companies {
if company.hasPrefix(searchString) {
arrayOfSearches.append(company)
}
}
这样你就不会搞砸String.Index
,如果你超出界限会抛出各种错误。
您也可以考虑将过滤作为替代方案......它更安全,更清洁,更短:
func loadSearchData(searchString:String) {
self.companiesToDisplay = self.companies.filter { $0.hasPrefix(searchString) }
self.companiesTV.reloadData()
}
这样的事情应该有效,但如果它与代码中的其他内容发生冲突,请发表评论。