如何过滤 searchBar 中的整个对象

How do I filter entire object in searchBar

在我的 Xcode 项目中,我有一个 tableViewlist 数据。我已经实现了 searchBar 来过滤用户输入。我希望它过滤我的整个对象 var contactArray = [ExternalAppContactsBook](),但出于某种原因,我只能过滤它的属性,例如 contactArray.firstName。这是 searchbar 函数中的样子:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {        
    if searchBar.text?.count == 0 {
        isFiltered = false
    }else {
        print("HELLO")
        isFiltered = true

        filteredName = contactArray.filter({[=10=].firstName.lowercased().prefix(searchText.count) == searchText})
    }
    tableViewOutlet.reloadData()
}

所以,我想要 [=23=].prefix 而不是 [=22=].firstName,但是编译器说没有这样的 属性。

使用 [=22=].firstName 我只能搜索列表中的名字,这非常有限...我正在以正确的方式解决这个问题,或者我应该怎么做?

编辑 ExternalAppContactsBook 看起来像这样:

class ExternalAppContactsBook {

var firstName = ""
var lastName = ""
var phoneNumber = ""
var company = ""
}

我重写了我的代码,但我 运行 遇到了同样的问题。这就是我现在在 searchBar textDidChange:

中得到的
filteredName = contactArray.filter({ object -> Bool in
    guard let text = searchBar.text else {return false}
    return object.firstName.contains(text)
})

这有效,但仅当我搜索列表中人员的名字时才有效。我也希望能够搜索他们的姓氏。

所以我尝试添加另一个:

filteredLastName = contactArray.filter({ object -> Bool in
    guard let text = searchBar.text else {return false}
    return object.lastName.contains(text)
})

然后在cellForRowAt_

 if isFiltered {
        contactName = filteredName[indexPath.row].firstName
        contactLastName = filteredLastName[indexPath.row].lastName
 ...}

但这显然行不通,并提供了一个问题,即 numberOfRowsInSection

中应返回多少 rows

您可以在过滤时简单地使用带 OR (||) 的条件

let filteredName = contactArray.filter {[=10=].firstName.starts(with: searchStr) || [=10=].lastName.starts(with: searchStr)}

您也可以将其作为函数添加到您的 class

func isMatch(_ searchString: String) -> Bool {
    return firstName.starts(with: searchString) || lastName.starts(with: searchString)
}

然后过滤

let filteredName = contactArray.filter {[=12=].isMatch(searchStr)}