理解compactMap和flatMap的问题

时间:2019-04-03 11:07:12

标签: arrays swift flatmap

我从多个教程中都了解到flatMap/compactMap用于flatten数组数组,但就我而言,它不能正常工作或无法正确理解。

let myArray = [["Raja","Kumar", nil,"Waqas"],["UAE","SINGAPORE","dUBAI","HONGKONG"]]
let final = myArray.compactMap{ $0 }

print("Result:\(final)")

输出:

Result:[[Optional("Raja"), Optional("Kumar"), nil, Optional("Waqas")], [Optional("UAE"), Optional("SINGAPORE"), Optional("dUBAI"), Optional("HONGKONG")]]

我尝试从上述数组中删除nil,但仍然不能使我的数组变平。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

.compactMap

...用于生成没有可选对象的列表,您需要在具有compactMap的内部数组上使用nil,如下所示:

let result = myArray.map { $0.compactMap { $0 } }

结果: [["Raja", "Kumar", "Waqas"], ["UAE", "SINGAPORE", "dUBAI", "HONGKONG"]]


.flatmap

...例如用于展平集合的集合

let result = myArray.flatMap { $0.compactMap { $0 } }

结果: ["Raja", "Kumar", "Waqas", "UAE", "SINGAPORE", "dUBAI", "HONGKONG"]

答案 1 :(得分:3)

compactMap应该用于从nil的数组中过滤出Optional个元素,而flatMap可以用来展平多维数组。但是,您需要同时做这两项。

let final = myArray.flatMap{$0.compactMap{$0}}

print("Result:\(final)")

答案 2 :(得分:3)

请阅读文档

map(_:)

  

返回一个数组,该数组包含将给定闭包映射到序列元素上的结果

compactMap(_:)

  

返回一个包含 non-nil个结果的数组,该结果使用该序列的每个元素调用给定的转换。

flatMap(_:)

  

返回一个数组,该数组包含用此序列的每个元素调用给定转换的关联结果

每个讨论部分都包含一个示例。