你如何在Swift中使用map函数?

时间:2015-11-08 02:02:05

标签: swift dictionary

我正在尝试了解.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

2 个答案:

答案 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?

例如,在给定转换基类型的函数的情况下,它会将任何可选输入类型转换为可选的输出类型。