主要问题是你正在使用字典作为数据源array.
我的建议是使用自定义结构作为模型
struct Contact {
let letter : String
var clients : [Client]
init(letter: String, clients : [Client] = [Client]()) {
self.letter = letter
self.clients = clients
}
mutating func add(client : Client) {
clients.append(client)
}
}
然后创建您的数据源数组
var contacts = [Contact]()
和字母数组作为计算属性
var letters : [String] = {
return contacts.map{ $0.letter }
}
按字母对数组进行排序很容易
contacts.sort{ $0.letter < $1.letter }
现在您可以通过这种方式搜索/过滤(text
是要搜索的文本)
filteredClient.removeAll()
for contact in contacts {
let filteredContent = contact.clients.filter {$0.name.range(of: text, options: [.anchored, .caseInsensitive, .diacriticInsensitive]) != nil }
if !filteredContent.isEmpty {
filteredClient.append(filteredContent)
}
}
如果您声明,您甚至可以保留这些部分(字母)filteredClient
也作为[Contact]
并创建临时的Contact
包含已过滤项目的实例。
当然,您需要更改所有表视图数据源/委托方法以符合Contact
数组,但这是值得的。数组作为数据源比字典更有效。