Swift 中如何使用 map 函数?

Dan*_*ieu 3 dictionary swift

我试图了解.map工作原理,并且我所有的搜索都返回了无法帮助我解决问题的示例。根据我的理解,这.map是执行for-in循环的一种更简洁的方式,唯一的区别是.map 替换原始 数组会创建一个新数组,而for-in只会更改原始数组的值。

试图

在下面的代码示例中,我希望该.map函数将我的轮子数组替换为状态属性都设置为 的新Tyre对象。.Flat

这是我试图在我的程序中完成的操场就绪版本:

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 }
Run Code Online (Sandbox Code Playgroud)

结果

错误:无法将“()”类型的值转换为关闭结果类型“轮胎”wheels =wheels.map { $0.state = .Flat }~~~~~~~~~^~~~~~~

在给定的情况下,如何将所有Tyre对象状态设置为.Flatusing .map

Dav*_*rry 6

有 2 个类似的关键函数执行类似的操作,其基本目的是获取一个数组并从中构建另一个数组:

func map(transform:(R)->T) -> [T] --- Map 获取一种类型的元素数组,并通过调用转换函数将其转换为(可能)另一种类型的元素数组依次每个元素。因此,您可以将 Int 数组转换为字符串数组:

[1, 2, 3, 4].map { "\($0)" } // --> ["1", "2", "3", "4"]
Run Code Online (Sandbox Code Playgroud)

func filter(predicate:(T)->Boolean) -> [T] -- Filter 获取一个元素数组并将其转换为相同类型的元素数组,但仅包含 predicate 返回 true 的元素。因此,您可以过滤整数数组以仅留下偶数:

[1, 2, 3, 4].filter { $0 % 2 == 0 } // --> [ 2, 4]
Run Code Online (Sandbox Code Playgroud)

还有其他变体,例如flatMap采用 [[T]] 并通过迭代输入和数组并将每个数组的内容附加到输出数组将其转换为 [T]:

[ [1, 2], [3, 4]].flatMap() // --> [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

其背后的概念也毫无价值map,简单来说,它可用于将任何输入类型映射到输出类型,因此您可以定义:

func <R, T> map(in:R?, transform:(R)->T) -> T?
Run Code Online (Sandbox Code Playgroud)

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


Cod*_*ent 5

问题$0.state = .Flat是一个任务。它不返回值。尝试这个:

wheels = wheels.map { w in
    w.state = .Flat
    return w
}
Run Code Online (Sandbox Code Playgroud)

map不会取代任何东西。据项目通过应用转换块从阵列到新阵列的每个元素。您可以选择将此新数组分配给旧数组,否则不会改变原始数组。