【发布时间】:2025-12-23 06:20:12
【问题描述】:
我有一系列模型:
struct Contact {
var givenName: String!
var familyName: String!
var organizationName: String!
}
我想使用 ONE UITextField 过滤这些联系人。我目前的问题是在单词之间定义并仅过滤匹配所有单词的联系人。
例如:
var contacts: [Contact] = [Contact(givenName: "David", familyName: "Seek", organizationName: "Aldi"),
Contact(givenName: "Johne", familyName: "Doe", organizationName: "Kaisers"),
Contact(givenName: "Jane", familyName: "Doe", organizationName: "Tengelmann"),
Contact(givenName: "Marco", familyName: "Seidl", organizationName: "Rewe"),
Contact(givenName: "Filip", familyName: "Halbig", organizationName: "Aldi")]
我想输入:David Aldi,只找到在 Aldi 工作的 David。我不想看到也在 Aldi 工作的 Filip。
另外,如果我输入David Do,我不想看到任何联系人,因为不应该匹配。
func getSearchResults(_ filterKey: String) {
self.presentActivityIndicator()
var processed: Int = 0
self.filteredContacts.removeAll()
DispatchQueue.global(qos: .background).async {
for contact in self.unfilteredContacts {
processed += 1
let lowercasedGivenName = contact.givenName.replacingOccurrences(of: " ", with: "").lowercased()
let lowercasedFamilyName = contact.familyName.replacingOccurrences(of: " ", with: "").lowercased()
let lowercasedOrganizationName = contact.organizationName.replacingOccurrences(of: " ", with: "").lowercased()
let name = lowercasedGivenName.appending(lowercasedFamilyName)
if name.range(of: filterKey.replacingOccurrences(of: " ", with: "")) != nil {
if !self.filteredContacts.contains(contact) {
self.filteredContacts.append(contact)
}
}
for word in filterKey.components(separatedBy: " ") {
if lowercasedOrganizationName.range(of: word.lowercased()) != nil {
if !self.filteredContacts.contains(contact) {
self.filteredContacts.append(contact)
}
}
}
if processed == self.unfilteredContacts.count {
self.reloadTableViewInMainThread()
}
}
}
}
这是我今天尝试的几种方法之一。但每一次尝试,我都最终过滤掉了大卫,通过输入第二个名字,我发现其他联系人与第一个名字大卫不匹配,但匹配例如部分姓氏或公司名称。
我缺少什么,最好的方法是什么?非常感谢您的帮助。
【问题讨论】:
-
一个结构,它的成员都是可变的,隐式展开的可选项......这很令人担忧。
-
@Alexander 这不是我的最终代码。在最终代码中,它是一个 CNContact 数组。这只是操场上的一个例子