这是非常基本的,但我有点困惑为什么我的代码不能工作。我有一个user
,它有一个可选的username
,我正在尝试检查email
或username
是否包含我的搜索查询
struct ChatUser: Codable, Identifiable {
let email: String
var username: String?
}
@State var user: ChatUser
if user.email.lowercased().contains(search.lowercased()) ||
user.username.lowercased().contains(search.lowercased()) {...}
如果我打开user.username!
,但由于打开零值,我的应用程序崩溃,这是有效的。如何检查user.username != nil
,然后在if检查中强制展开?
一次又一次地调用lowercased()
是不必要的开销。
但对于给定的语法,这是快速的方式
if user.email.lowercased().contains(search.lowercased()) ||
user.username?.lowercased().contains(search.lowercased()) == true {...}
如果用户名为nil
,则可选链接表达式立即返回nil
。
然而,range(of:options:
可以处理可选的和情况
if user.email.range(of: search, options: .caseInsensitive) != nil ||
user.username?.range(of: search, options: .caseInsensitive) != nil {
}
您可以使用nil-coalescing(??)
来打开您的可选值。
if user.email.lowercased().contains(search.lowercased()) ||
user.username?.lowercased().contains(search.lowercased()) ?? false {
}
if user.email.lowercased().contains(search.lowercased()) ||
(user.username.map { $0.lowercased().contains(search.lowercased()) } ?? false) {
}