如何只映射非空值?

时间:2017-01-20 23:33:50

标签: arrays swift

我正在构建一个iOS应用程序,我有一个带有文本字段的数组,我想将这些字段的文本映射到数组中。

这是我尝试的,它可以工作,但我只想映射一个值,如果它不是空的。即使文本字段为空,我也能得到所有内容。

textFields.map{$0.text!}

更新

我解决了这个问题

textFields.filter({$0.text! != ""}).map({$0.text!})

6 个答案:

答案 0 :(得分:1)

textFields.flatMap({ $0.text }).filter({ !$0.isEmpty })

或者,如果您想避免flatMap

textFields.map({ $0.text }).filter({ !($0?.isEmpty ?? true) })

答案 1 :(得分:0)

我解决了这个问题:

textFields.filter({$0.text! != ""}).map({$0.text!})

答案 2 :(得分:0)

目前的答案都涉及两次通过数组:一次过滤,一次过映射。

更有效的方法是:

textFields.flatMap{ $0.text?.isEmpty == false ? $0.text! : nil }

闭包{ $0.text?.isEmpty == false ? $0.text! : nil }返回每个元素的text属性,如果它是非零的(因为它是一个可选属性)并且它不是空的(空意味着== "")。否则,它将返回nil

因为flatMap方法已经从最终结果中排除了任何nil值,所以这保证了返回将只是来自原始元素的非零,非空text字符串的数组,并且这样做只有一次通过数组。

答案 3 :(得分:0)

我就是这样做的:

textFields.flatMap{
    guard let t = $0.text, !t.isEmpty else { return nil }
    return t
}

答案 4 :(得分:0)

为了过滤非空值,我们可以在SWIFT 3中使用FILTER。

filter({$0.text! != ""})

您无需使用MAP功能。

这将只为您提供非空(!=“”)值。

感谢。

答案 5 :(得分:0)

丹尼尔·霍尔(Daniel Hall)回答,您应该避免2次通过。 在Swift 4之前,您需要使用他所说的flatMap。 但是现在您需要这样使用compactMap:

let array = [1, 2, nil, 4, nil, 6]
let cleanArray = array.compactMap { $0 * 1 }

这将运行6次(每个值1个),但结果只有4个值。

更多信息在这里: https://medium.com/@abhimuralidharan/higher-order-functions-in-swift-filter-map-reduce-flatmap-1837646a63e8