Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何允许用户基于两个条件进行搜索_Ios_Swift_Firebase_Uisearchbar - Fatal编程技术网

Ios 如何允许用户基于两个条件进行搜索

Ios 如何允许用户基于两个条件进行搜索,ios,swift,firebase,uisearchbar,Ios,Swift,Firebase,Uisearchbar,我正在尝试实现一个搜索栏,用户可以根据姓名或职业搜索某人。我编写了下面的函数,但应用程序在返回语句时使用OR运算符崩溃。有没有一种合适的方法来编写这个函数来同时考虑这两种可能性——根据输入的姓名或职业来获取结果?注意:我使用Firebase存储用户信息;名称和职业有各自独立的字段和相应的值 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if searchT

我正在尝试实现一个搜索栏,用户可以根据姓名或职业搜索某人。我编写了下面的函数,但应用程序在返回语句时使用OR运算符崩溃。有没有一种合适的方法来编写这个函数来同时考虑这两种可能性——根据输入的姓名或职业来获取结果?注意:我使用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()
}

我看没问题。崩溃日志/堆栈跟踪显示了什么?您得到了什么错误…?线程1:致命错误:在隐式展开可选值时意外发现nil。不确定这里出了什么问题,因为它在没有OR语句的情况下实现时可以正常工作。occupation是nil,那么在这种情况下,我猜occupation字段在您的数据结构中是可选的。此解决方案似乎有意义,但会引发以下错误:在预期返回'Bool'的闭包中缺少返回