根据Swift中的空值过滤数组

时间:2015-04-23 07:16:05

标签: ios arrays xcode swift filter

我正在尝试过滤一系列字典。以下代码是我正在寻找的场景的样本

let names = [ 
    [ "firstName":"Chris","middleName":"Alex"],
    ["firstName":"Matt","middleName":""],
    ["firstName":"John","middleName":"Luke"],
    ["firstName":"Mary","middleName":"John"],
]

最终结果应该是一个有中间名的数组。

4 个答案:

答案 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
}