我正在尝试构建一个能够完成我的标题所说的闭包。我的代码运行但它没有打印出我的预期。
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 [(), (), ()]
答案 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"]
(哦,它更短)