所以我正在过滤数据(所有字符串),并希望显示以下内容:
我已让他们两个分开工作(请参阅let found
和let foundMore
),但现在我想合并他们(首先显示第一个字母包含搜索的搜索字词) ,在字符串包含单词之后)。尝试使用加号,但它出现以下错误
二元运算符'+'不能应用于两个'Range?'操作数
extension SearchResultsController : UISearchResultsUpdating {
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.tableView.reloadData()
let searchBar = searchController.searchBar
let target = searchBar.text!
self.filteredData = self.originalData.filter {
s in
let options = NSStringCompareOptions.AnchoredSearch
let found = s.rangeOfString(target, options: options)
let optionsMore = NSStringCompareOptions.CaseInsensitiveSearch
let foundMore = s.rangeOfString(target, options: optionsMore)
let allTogether = found + foundMore
return (allTogether != nil)
}
self.tableView.reloadData()
}
}
答案 0 :(得分:3)
范围不能一起添加,因为当两个范围不相交时,结果可能不是合适的范围。
但是,您无需添加此内容,因为最后您将整体范围与nil
进行比较。这意味着您可以将双方单独比较为nil
:
return s.rangeOfString(target, options: NSStringCompareOptions.AnchoredSearch) != nil
|| s.rangeOfString(target, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil
检查1.和2.,应该是这样看的,而不是两者的混合
然后你应该过滤两次,然后将第二个数组追加到第一个:
var filtered1 = self.originalData.filter { s in
return s.rangeOfString(target, options: NSStringCompareOptions.AnchoredSearch) != nil
}
let filtered2 = self.originalData.filter { s in
// Exclude results of the first search
return s.rangeOfString(target, options: NSStringCompareOptions.AnchoredSearch) == nil
&& s.rangeOfString(target, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil
}
filtered1 += filtered2
self.filteredData = filtered1
答案 1 :(得分:0)
对于您的情况,您可以将+
替换为??
,以便如果任一范围为非零,则将其设置为allTogether
的值。这是最小的代码,但不一定是最明显或易于阅读的。明确的逻辑OR nil测试更明显。
答案 2 :(得分:0)
如果可能,你可以试试这个:
let indexSet = NSMutableIndexSet()
indexSet.addIndexesInRange(NSMakeRange(0, 5))
indexSet.addIndexesInRange(NSMakeRange(10, 4))
indexSet.addIndex(5)
println(indexSet)
然后你可以在这里做你的活动:
indexSet.enumerateIndexesUsingBlock { (index, stop) -> Void in
println(index)
}