gpt4 book ai didi

ios - 包含可选的过滤器数组 - SearchBar

转载 作者:行者123 更新时间:2023-11-28 10:07:22 24 4
gpt4 key购买 nike

只是一些后见之明,让您了解我的问题。我目前正在为我在设备上保存了 GuestList CoreData 的事件编写 iOS 应用程序。

在 viewDidLoad 上,它会获取 coredata 对象并将其放入 [GuestDetails] 数组中

现在Guestdetail对象结构如下:

private(set) public var guestFirstName: String
private(set) public var guestLastName: String?
private(set) public var guestEmail: String?
private(set) public var guestPhone: String?
private(set) public var guestUUID: UUID
private(set) public var guestBarcode: String?
private(set) public var guestCheckedIn: Bool

这样只有名字、UUID 和 checkinStatus 是强制性的。我已经设置了通过 JSON 添加,但现在我的问题出在我的 GuestListViewController 上,我有一个搜索栏

Guest List Page

我正在使用以下代码和数组来确保我可以过滤。我有另一个数组,叫做

searchResultArray = [GuestDetails]()

所以基本上我会将我所有的客人详细信息复制到 searchResultArray,tableView 从中获取其来源。

现在作为搜索的一部分,我使用了我在 appcoda 上找到的这段代码

searchResultArray = guestData.filter({guestData -> Bool in
(guestData.guestFirstName.lowercased().contains(searchText.lowercased())) ||
(guestData.guestLastName?.lowercased().contains(searchText.lowercased()))! ||
(guestData.guestBarcode?.contains(searchText))!
})

问题是我的应用程序崩溃了,如果我只按名字搜索它不会崩溃,因为它们很好地强制展开,但如果我添加代码来搜索姓氏或条形码,它就会崩溃。我知道这可能是因为显式解包,但 xcode 不允许我不解包。

  • 我尝试过使用 map (这没有帮助,除非我对它不够熟悉),
  • 我已经尝试过 .compact(但我无法让它工作,因为我不确定它如何访问 GuestDetail 对象的内部以删除 nils)

  • 问题是 [GuestDetails] 数组本身不会包含空值,GuestDetails 对象中的一些细节可能会导致崩溃。

我的问题是,如何让它按名字(已经可以)、姓氏和条形码进行搜索?

谢谢,我希望这个问题足够详细。

最佳答案

我会避免像这样使用强制解包:

searchResultArray = guestData.filter({guestData -> Bool in
let searchLowercased = searchText.lowercased()
if guestData.guestFirstName.lowercased().contains(searchLowercased) {
return true
}

if let guestLastName = guestData.guestLastName, guestLastName.lowercased().contains(searchLowercased) {
return true
}

if let guestBarcode = guestData.guestBarcode, guestBarcode.lowercased().contains(searchLowercased) {
return true
}

return false
})

从评论中回答您的问题:您不必在可选项上使用 ? 运算符,因为我们使用 Optional Binding if let 语法。例如:

if let guestLastName = guestData.guestLastName 如果 guestData.guestLastNamenil 我们将跳出此 if 语句。然后你会在 if 语句 中看到 ,,只有当 guestData.guestLastName 不是 nil 时,我们才会传递这个逗号>,这就是为什么我们可以使用未包装的 String 并且不再是可选的 String?guestLastName 变量,然后我们继续检查是否搜索词与 guestLastName 匹配并返回 true

请阅读:if let , if var, guard let,guard var and defer statements in swift

如果您碰巧向您的数据添加另一个属性并避免执行所有这些操作,那就更好了if else您可以这样做:

searchResultArray = guestData.filter({guestData -> Bool in
let searchLowercased = searchText.lowercased()
let matches:[String?] = [guestData.guestFirstName, guestData.guestLastName, guestData.guestBarcode]
let nonNilElements = matches.compactMap { $0 }

for element in nonNilElements {
if element.lowercased().contains(searchLowercased) {
return true
}
}
return false
})

关于ios - 包含可选的过滤器数组 - SearchBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51821367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com