我正在构建一个iOS应用程序,我有一个带有文本字段的数组,我想将这些字段的文本映射到数组中。
这是我尝试的,它可以工作,但我只想映射一个值,如果它不是空的。即使文本字段为空,我也能得到所有内容。
textFields.map{$0.text!}
更新
我解决了这个问题
textFields.filter({$0.text! != ""}).map({$0.text!})
答案 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个值。