【问题标题】:Filter an array based on empty value in Swift在 Swift 中根据空值过滤数组
【发布时间】:2015-07-01 05:10:56
【问题描述】:

我正在尝试过滤字典数组。下面的代码是我正在寻找的场景示例

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

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

【问题讨论】:

    标签: ios arrays xcode swift filter


    【解决方案1】:

    这成功了

    names.filter {
      if let middleName = $0["middleName"] {
        return !middleName.isEmpty
      }
      return false
    }
    

    【讨论】:

      【解决方案2】:

      这也很好用

      names.filter {
      
      if let middleName = $0["middleName"] {
       return middleName != ""
      }
      return false
      }
      

      【讨论】:

      • 其他的比较简洁,但是对于不熟悉闭包语法的人来说更易读
      【解决方案3】:

      您也可以使用 nil-coalescing 运算符非常简洁地表达这一点:

      let noMiddleName = names.filter { !($0["middleName"] ?? "").isEmpty }
      

      这会将缺少的中间名替换为空字符串,因此您可以使用 .isEmpty 处理任何一种(如果您想获取那些 带有 中间名的中间名,则可以取反)。

      您还可以使用可选链接和 nil-coalescing 运算符以另一种方式表达它:

      let noMiddleName = names.filter { !($0["middleName"]?.isEmpty ?? true) }
      

      如果值不是nil$0["middleName"]?.isEmpty 将调用isEmpty,但返回一个可选值(因为它可能是nil)。然后使用??true 替换为nil

      【讨论】:

        【解决方案4】:

        略短:

        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)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-06
          • 2015-10-13
          • 2017-03-13
          • 2019-05-03
          • 2020-10-01
          相关资源
          最近更新 更多