2017-08-09 2 views
0

J'essaie de créer une barre de recherche dans un TableView. J'ai été en mesure d'obtenir la barre de recherche dans l'interface utilisateur, mais je suis aux prises avec la logique de la fonctionnalité de recherche. J'ai suivi un tutoriel, mais j'ai toujours une erreur dans le code.Erreur lors de la création d'une barre de recherche: L'initialiseur pour la liaison conditionnelle doit avoir le type Option, pas 'Chaîne'

Toutes les données sont lues correctement via un fichier json. '

Je reçois une erreur dans la fonction 'filterContent (for:)'. L'erreur indique que "Initializer pour la liaison conditionnelle doit avoir le type facultatif, pas 'String'"

Voici le code approprié dans ma classe TableView. (Notez la ligne avec l'erreur marquée d'un commentaire).

import UIKit 

class LocationTableViewController: UITableViewController, UISearchResultsUpdating { 

    var locations = [Location]() 

    var searchController:UISearchController! 
    var searchResults = [Location]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     searchController = UISearchController(searchResultsController: nil) 
     tableView.tableHeaderView = searchController.searchBar 

     searchController.searchResultsUpdater = self 
     searchController.dimsBackgroundDuringPresentation = false 

    } 

    func filterContent(for searchText: String) { 

     searchResults = locations.filter({ (location) -> Bool in 
      // The following line receives the error 
      if let name = location.name { 
       let isMatch = name.localizedCaseInsensitiveContains(searchText) 
       return isMatch 

      } 

      return false 

      }) 

    } 


    func updateSearchResults(for searchController: UISearchController) { 
     if let searchText = searchController.searchBar.text { 
      filterContent(for: searchText) 
      tableView.reloadData() 
     } 
    } 

Répondre

0

Cela signifie que:

location.name 

n'est pas une option, mais vous utilisez la syntaxe conditionnelle (LET). Cela ne fonctionne que pour les options et location.name n'est pas optionnel.

Si vous changez ceci:

if let name = location.name { 
      let isMatch = name.localizedCaseInsensitiveContains(searchText) 
      return isMatch 
     } 
     return false 

à ceci:

 let name = location.name 
     let isMatch = name.localizedCaseInsensitiveContains(searchText) 
     return isMatch 

il compilera correctement. Pas besoin de "retour faux"

+0

Merci pour votre réponse. J'aurais dû mentionner que j'ai déjà essayé cela. L'application génère, cependant, il se bloque lors de l'ouverture de l'application. Le journal lit 'erreur fatale: trouvé de manière inattendue nil tout en déballant une valeur facultative.' – joshlorschy