我试图通过匹配用户名或全名来过滤Swift中的对象数组。
filteredRegUserArray = regUserArray.filter {
$0.userName.lowercaseString.hasPrefix(lowercasePrefix) ||
$0.fullName.lowercaseString.hasPrefix(lowercasePrefix)}
答案 0 :(得分:4)
所以看起来你有像我这样的结构(或类)
struct User {
let userName: String?
let fullName: String?
}
您还拥有一组用户
let users = [User]()
现在,当您尝试过滤数组时
let lowercasePrefix = "abc"
let filtered = users.filter {
$0.userName.lowercaseString.hasPrefix(lowercasePrefix) == true
|| $0.fullName.lowercaseString.hasPrefix(lowercasePrefix) == true
}
你得到一个错误。
这种情况正在发生,因为userName
和fullName
被定义为选项。在这种情况下,您不能简单地编写$0.userName.lowercaseString
,因为编译器无法确定userName
内是否存在值。它会阻止您在lowercaseString
值上读取nil
属性,以防止崩溃。
您似乎修复了以这种方式更改结构的问题
struct User {
var userName: String = " "
var fullName: String = " "
init(userName:String, fullName:String) {
self.userName = userName
self.fullName = fullName
}
}
我说这很难看。这也是斯威夫特从一开始就试图战斗的东西。我们的想法是,您应该从不使用0
或empty String
(或者在这种情况下奇怪地为blank space
之类的值)来表示缺少价值。 缺少价值必须用nil
表示。
因此,虽然这个解决方案确实可以编译,但从设计的角度来看它很糟糕,将来可能会给你带来一些问题。
永远不要接受nil
User
值
struct User {
let userName: String
let fullName: String
}
let users = [User]()
let lowercasePrefix = "abc"
let filtered = users.filter {
$0.userName.lowercaseString.hasPrefix(lowercasePrefix) == true
|| $0.fullName.lowercaseString.hasPrefix(lowercasePrefix) == true
}
如果用户的nil
值为userName
或fullName
(这是您的应用,只有您可以回答此问题),那么只需管理这种可能性
struct User {
let userName: String?
let fullName: String?
}
let users = [User]()
let lowercasePrefix = "abc"
let filtered = users.filter {
$0.userName?.lowercaseString.hasPrefix(lowercasePrefix) == true
|| $0.fullName?.lowercaseString.hasPrefix(lowercasePrefix) == true
}