我正在尝试了解.map
的工作方式,而且我的所有搜索都返回了无法帮我解决问题的示例。根据我的理解.map
是一种更简洁的方式来执行 for-in 循环,唯一的区别是.map
取代原来的 创建一个新的数组, for-in 只是改变原始数组值。
在下面的代码示例中,我希望.map
函数将轮次数组替换为状态的新轮胎对象strong>属性都设置为.Flat
。
这是我想要在我的程序中完成的 playground-ready 版本:
enum State {
case Ok, Flat
}
class Tire {
var state = State.Ok
init(t: State) {
state = t
}
}
var wheels = [Tire(t: .Ok), Tire(t: .Ok), Tire(t: .Ok)]
wheels = wheels.map { $0.state = .Flat }
错误:无法将类型'()'的值转换为闭包结果类型'Tire' wheels = wheels.map {$ 0.state = .Flat} ~~~~~~~~~ ^ ~~~~~~
在给定的情况下,如何使用.Flat
将所有轮胎对象状态设置为.map
?
答案 0 :(得分:3)
问题是$0.state = .Flat
是一项任务。它不返回值。试试这个:
wheels = wheels.map { w in
w.state = .Flat
return w
}
map
不会取代任何内容。它通过应用转换块将项目从数组中的每个元素投射到新数组。您可以选择将此新数组分配给旧数组,但否则不会更改原始数组。
答案 1 :(得分:2)
有两个类似的键函数执行类似的操作,其基本目的是获取一个数组并从中构建另一个数组:
func map(变换:(R) - > T) - > [T] --- Map接受一种类型的元素数组,并通过依次调用每个元素上的变换函数将其转换为(可能)另一种类型的元素数组。因此,您可以将Int的数组转换为字符串数组:
[1, 2, 3, 4].map { "\($0)" } // --> ["1", "2", "3", "4"]
func filter(谓词:(T) - >布尔) - > [T] - Filter获取一个元素数组并将其转换为相同类型的元素数组,但仅包括谓词返回true的那些元素。因此,您可以过滤一组int,只留下偶数:
[1, 2, 3, 4].filter { $0 % 2 == 0 } // --> [ 2, 4]
还有其他变体,例如flatMap
,它通过迭代输入和数组并将每个数组的内容附加到输出数组来获取[[T]]并将其转换为[T]:
[ [1, 2], [3, 4]].flatMap() // --> [1, 2, 3, 4]
map
背后的概念也是值得的,简单来说,它可用于将任何输入类型映射到输出类型,因此您可以定义:
func <R, T> map(in:R?, transform:(R)->T) -> T?
例如,在给定转换基类型的函数的情况下,它会将任何可选输入类型转换为可选的输出类型。