【问题标题】:How to add two Range<Index> together?如何将两个 Range<Index> 加在一起?
【发布时间】:2016-12-06 08:24:52
【问题描述】:

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

  1. 第一个字母包含您的搜索的搜索词(例如。搜索时 'Br' 我想查看所有以 'Br' 开头的词,例如 Break , 坏了,...)
  2. 字符串中包含单词的搜索词(例如,搜索“Br”时会显示所有包含“br”的单词,例如“groundbreaker”)。

我让他们两个分开工作(见let foundlet foundMore),但现在我想合并他们(首先显示第一个字母包含您的搜索的搜索词,在那些之后其中字符串包含单词)。尝试使用加号,但它给出了以下错误

二元运算符“+”不能应用于两个“范围?”操作数

    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()
    }
}

【问题讨论】:

    标签: ios swift search filter range


    【解决方案1】:

    范围不能相加,因为当两个范围不相交时,结果可能不是正确的范围。

    但是,您不需要添加它,因为最后您将整个范围与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. 和 2.,它们应该像这样查看,而不是两者的混合)。就像我想在第一个数组的末尾做一个 .append (如果这有意义的话)
    • @SoundShock 这也是可行的 - 请参阅编辑。
    • 谢谢,这正是我想要的!
    【解决方案2】:

    如果可以的话,你可以试试这个:

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

    【讨论】:

      【解决方案3】:

      对于您的情况,您可以将+ 替换为??,这样如果任一范围不为零,它将被设置为allTogether 的值。这是最少的代码,但不一定是最明显或最容易阅读的。明确的逻辑 OR nil 测试更明显。

      【讨论】:

      • 嗨,这确实是我已经探索过的一个选项,但在这种情况下,它不会按照我想要的方式过滤我的数据(首先显示第一个字母包含您的搜索的搜索词(例如。搜索“Br”时,我想查看所有以“Br”开头的单词,例如 Break、Broke、...) 字符串包含单词的搜索词(例如。搜索“Br”时显示所有像“groundbreaker”这样的词中包含“br”的词)。
      • 那是因为过滤和排序是两个不同的东西,需要先过滤后排序
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 2018-12-04
      相关资源
      最近更新 更多