如何将两个Range <index>一起添加?

时间:2016-08-01 09:47:29

标签: ios swift search filter range

所以我正在过滤数据(所有字符串),并希望显示以下内容:

  1. 第一个字母包含您的搜索的搜索字词(例如。搜索'Br'时,我希望看到所有以'Br'开头的字词,如Break ,打破,......)
  2. 字符串包含单词的搜索词(例如。搜索'Br'时,显示单词中包含'br'的所有单词,如'groundbreaker')。
  3. 我已让他们两个分开工作(请参阅let foundlet 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()
        }
    }
    

3 个答案:

答案 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)
}