我正在尝试过滤一系列字典。以下代码是我正在寻找的场景的样本
let names = [
[ "firstName":"Chris","middleName":"Alex"],
["firstName":"Matt","middleName":""],
["firstName":"John","middleName":"Luke"],
["firstName":"Mary","middleName":"John"],
]
最终结果应该是一个有中间名的数组。
答案 0 :(得分:4)
这就是诀窍
names.filter {
if let middleName = $0["middleName"] {
return !middleName.isEmpty
}
return false
}
答案 1 :(得分:3)
你也可以使用nil-coalescing运算符来非常简洁地表达:
let noMiddleName = names.filter { !($0["middleName"] ?? "").isEmpty }
这会将缺少的中间名替换为空字符串,因此您可以使用.isEmpty
处理(如果您想要使用中间名来获取,则取消否定)。
您还可以使用可选链接和nil-coalescing运算符以另一种方式表达:
let noMiddleName = names.filter { !($0["middleName"]?.isEmpty ?? true) }
如果值不是$0["middleName"]?.isEmpty
, isEmpty
会调用nil
,但会返回一个可选项(因为它可能是nil
)。然后,您使用??
将true
替换为nil
。
答案 2 :(得分:3)
略短:
let result = names.filter { $0["middleName"]?.isEmpty == false }
这处理所有三种可能的情况:
$0["middleName"]?.isEmpty
评估为false
和谓词
返回true
。$0["middleName"]?.isEmpty
评估为true
和谓词
返回false
。$0["middleName"]?.isEmpty
评估为nil
和谓词
返回false
(因为nil
!= false
)。答案 3 :(得分:0)
这也可以正常使用
names.filter {
if let middleName = $0["middleName"] {
return middleName != ""
}
return false
}