【问题标题】:Multiple search in string - swift 4+字符串中的多重搜索 - swift 4+
【发布时间】:2019-07-25 18:34:42
【问题描述】:

我的代码有一个简单的问题.. 我不想像在 facebook messenger 中那样进行搜索 - 我是什么意思? 我将多个字符串转换为一个没有空格的字符串,例如

“我的字符串骆驼”->“我的字符串骆驼”

我想让搜索者通过两个或多个单词进行搜索,例如: 当我输入“my ama”时,我想搜索包含这些字符的每条记录。 有人可以帮忙吗?

我的代码:

func searchFor(text: String) {
    if text == "" || text.count == 0 {
        loadPricesFromDb()
    }
    else {

        let realm = try! Realm()
        self.items = []
        let prices = realm.objects(Price.self)
       let results = prices.filter({($0.MultipleSearchString?.lowercased().contains(text.rangeOfCharacter(from: text)))!
       })

        self.items.append(contentsOf: results)
        self.tableView.reloadData()
    }
}

我只是想让它变得更好。现在我不知道我需要使用什么作为过滤器才能很好地搜索它..:/

【问题讨论】:

标签: ios swift string search


【解决方案1】:

您可能会找到一个数据库命令来进行这种搜索。如果我正确理解您的要求,那么在swift中很容易构造如下这样的谓词。

  let multipleSearchString = "my stg l la ma"

  let texts = ["mystringlladm1a", "mystr2ingllama", "mystri2ngllama", "mys3ringllama"]

  let key =  multipleSearchString.compactMap{ $0 == " " ? nil : String($0) + "*"}.joined()

  let predicate =  NSPredicate(format: "SELF like[c] %@", argumentArray: [key])

  print (texts.filter{predicate.evaluate(with: $0)})
 //["mystringlladm1a", "mystr2ingllama", "mystri2ngllama"]

在您添加的情况下,可以添加一个计算属性来实现您的目标:

  //  extension Price{
 //   var lowerCasedMultipleSearchString: String{
 //       if let string = self.MultipleSearchString?.lowercased(){
  //          return string
 //       }
 //      return ""
 //  }
 //   }

   //  func searchTextInPrices(prices: Results<Price>, text: String) ->     //Results<Price> {
   // let key =  text.compactMap{ $0 == " " ? nil : String($0) + "*"}.joined()
   //  let predicate =  NSPredicate(format: "SELF like[c] %@", argumentArray: [key])
   //  return prices.filter{predicate.evaluate(with: $0.lowerCasedMultipleSearchString)}
   //  }


func searchFor(text: String) {
if text == "" || text.count == 0 {
    loadPricesFromDb()
}
else {

    let realm = try! Realm()
    self.items = []
    let prices = realm.objects(Price.self)

  //The changed codes here. 

   let key =  text.compactMap{ $0 == " " ? nil : String($0) + "*"}.joined()
   let predicate =  NSPredicate(format: "SELF like[c] %@", argumentArray: [key])
    let results = prices.filter{predicate.evaluate(with: ($0.MultipleSearchString?.lowercased())!)}

//second edition:

 var result = prices
 var length : Int = 0
 repeat{
let key =  text[...(text.index(text.startIndex, offsetBy: length))].compactMap{ $0 == " " ? nil : String($0) + "*"}.joined()
let predicate =  NSPredicate(format: "SELF like[c] %@", argumentArray: [key])
results =  prices.filter{predicate.evaluate(with: ($0.MultipleSearchString?.lowercased())!)}
length += 1} while(length < text.count)

   //Third edition:

  let results =  prices.filter{ text.reduce((($0.MultipleSearchString?.lowercased())!, true)){
    if !$0.1 {return ("",false)}
    else if let index = $0.0.index(of: $1) {return  (String($0.0[index...]),true)}
    return ("",false)
    }.1}



 self.items.append(contentsOf: results)
    self.tableView.reloadData()
}
}

【讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat。请确保答案是 edited 以包括所有必要的更改,以使未来的读者受益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2017-01-31
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多