如何让用户根据两个条件进行搜索

How to allow users to search based on two criteria

我正在尝试实现一个搜索栏,用户可以在其中根据姓名或职业搜索某人。我在下面编写了函数,但应用程序在使用 OR 运算符的 return 语句处崩溃。是否有一种适当的方法来编写此函数以允许两种可能性——根据输入一个人的姓名或他们的职业来获得结果?注意:我使用的是Firebase来存储用户信息;姓名和职业有各自独立的字段和对应的值。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            
    if searchText.isEmpty || searchText == " " {
        inSearchMode = false
        tableView.reloadData()
    } else {
        inSearchMode = true
        filteredUsers = users.filter({ (user) -> Bool in
            return user.name.contains(searchText) || user.occupation.contains(searchText)
        })
        tableView.reloadData()
    }
}

您似乎得到了 nil 值,因为职业是可选的,因此您可以按如下方式重构您的函数:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
    if searchText.isEmpty || searchText == " " {
        inSearchMode = false
        tableView.reloadData()
    } else {
        inSearchMode = true
        filteredUsers = users.filter({ (user) -> Bool in
            if let occupation = user.occupation {
                return occupation.contains(searchText)
            }
            if let name = user.name {
                return name.contains(searchText)
            }
            return false
        })
        tableView.reloadData()
    }
}

您可以试试这个来防止 nil 错误:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            
    if searchText.isEmpty || searchText == " " {
        inSearchMode = false
        tableView.reloadData()
    } else {
        inSearchMode = true
        filteredUsers = users.filter({ (user) -> Bool in
            return (user.name.contains(searchText) == true) || (user.occupation.contains(searchText) == true)
        })
        tableView.reloadData()
    }
}

尝试像这样编辑您的代码:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
{
    if searchText.isEmpty || searchText == " " {
        inSearchMode = false
    } else {
        inSearchMode = true
        filteredUsers = users.filter({ (user) -> Bool in
            return (user.name?.contains(searchText) ?? true) || (user.occupation?.contains(searchText) ?? true)
        })
    }

    tableView.reloadData()
}