从Dictionary中获取键并将它们映射到数组

时间:2017-06-22 17:15:50

标签: arrays swift dictionary closures

我正在尝试构建一个能够完成我的标题所说的闭包。我的代码运行但它没有打印出我的预期。

var names: [String] = []
var namesAndAges = ["Tom": 25, "Michael": 35, "Harry": 28, "Fabien": 16]

var ofAge = namesAndAges.filter { namesAndAges in namesAndAges.value > 18 }

var addNames = ofAge.map { ofAge in names.append(ofAge.key) }

print(addNames) //this prints [(), (), ()]

3 个答案:

答案 0 :(得分:1)

基本上你是在滥用过滤器和地图方法。 试试这个:

var names: [String] = []
var namesAndAges = ["Tom": 25, "Michael": 35, "Harry": 28, "Fabien": 16]

var ofAge = namesAndAges.filter { $0.value > 18 }

var addNames = ofAge.map { $0.key }

print(addNames) //this prints ["Michael", "Harry", "Tom"]

答案 1 :(得分:0)

您遇到的问题是因为names.append(ofAge.key)返回Void(例如空元组,())。 map生成一个新的Array,其中包含给定闭包的返回值,在您的示例中将其应用于源数组的每个元素(ofAge之后)。

names数组实际上会包含您想要的数据,但这并不是map的使用方式(您基本上使用它代替{{ 1}})。

请改为尝试:

forEach

答案 2 :(得分:0)

为了避免多次循环,我就是这样做的:

var namesAndAges = ["Tom": 25, "Michael": 35, "Harry": 28, "Fabien": 16]
let addNames: [String] = namesAndAges.flatMap { $0.value > 18 ? $0.key : nil }
print(addNames) // prints ["Michael", "Harry", "Tom"]

(哦,它更短)