Dans Swift 5.3, dans ma barre de recherche, je souhaite afficher un tableau de résultats où chacune de ses cellules doit contenir tous les mots recherchés, quel que soit l'ordre dans lequel ils ont été écrits dans la barre de recherche.

Exemple : j'ai une structure d'objets :

struct Object {
  var story : String
  var age: Int
  ...
}

Ma tableview affiche ce tableau avant la recherche :

Array  : [Object] =  [
              Object(story:"English texts for beginners to practice", age: 1200),
              Object(story:"reading and comprehension online", age: 1600),
              Object(story:"and for free. Practicing your comprehension", age: 1800),
              Object(story:"of written English will both improve", age: 1100),
              Object(story:"your vocabulary and comprehension", age: 1500),
              Object(story:"of grammar and word order." age: 1400)
             ]

Et lorsque j'appuie sur "compréhension de votre" dans la barre de recherche, il récupère ce tableau filtré :

filteredArray = [
              Object(story:"and for free. Practicing your comprehension", age: 1800),
              Object(story:"your vocabulary and comprehension", age: 1500)
              ]

Et bien sûr j'ai cette fonction de UISearchBar

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       if searchText.isEmpty {
               filteredArray = Array // To see all the Array

self.tableView.reloadData()
}

Voici ce que j'ai essayé, mais ce n'est pas ce dont j'ai besoin

if let searchBarText = searchBar.text{
                let searchText = searchBarText.lowercased()
                           filteredArray = Array.filter ({$0.story.lowercased().range(of: searchText.lowercased()) != nil})
                
                           filteredArray += Array.filter ({$0.story.lowercased().range(of: searchText.lowercased()) != nil})
                           tableView.reloadData()
               }
0
Wahib 30 oct. 2020 à 17:45

1 réponse

Meilleure réponse

Vous pouvez créer un ensemble de mots de recherche donnés, puis utiliser filter où tous les mots du texte de recherche sont vérifiés par rapport au story en utilisant allSatisfy

let words = Set(searchText.split(separator: " ").map(String.init))
let filtered = array.filter { object in words.allSatisfy { word in object.story.localizedCaseInsensitiveContains(word) } })
3
Joakim Danielson 30 oct. 2020 à 15:10