Swift中的数组映射与forEach

时间:2017-08-02 01:21:15

标签: swift struct collections

在Swift数组中,你可以这样做:

var myArray = [1,2,3,4]

myArray.forEach() { print($0 * 2) }

myArray.map() { print($0 * 2) }

他们都做同样的事情。唯一的区别是.map还会返回一个空洞数组[(),(),(),()],它会被取消使用。这是否意味着.map在没有分配给任何东西的情况下比.forEach更差?

3 个答案:

答案 0 :(得分:11)

根据Apple的定义,在Swift中,

  

map   用于返回包含映射结果的数组   给出序列元素的闭包

而,

  

forEach   在序列中的每个元素上调用给定的闭包   订购为for-in循环。

两者在Swift中都有两个不同的目的。尽管在您的示例map中工作正常,但这并不意味着您应该在这种情况下使用map

map例如: -

let values = [1.0, 2.0, 3.0, 4.0]
let squares = values.map {$0 * $0}
  

[1.0,4.0,9.0,16.0] // square现在有这个数组,在某处使用

forEach例如: -

let values = [1.0, 2.0, 3.0, 4.0]
values.forEach() { print($0 * 2) }

打印数字以下。这次没有返回任何数组。

  

2.0

     

4.0

     

6.0

     

8.0

简而言之,回答你的问题,是map生成的数组是浪费的,因此forEach是你在这种情况下应该使用的。

<强>更新

OP已经评论说,当他进行测试时,与map相比,forEach的效果更好。这是我在操场上尝试找到的。对我而言,forEach的效果优于map,如图所示。 forEach耗时51.31秒,map耗时51.59秒,差异为0.28秒。我没有声称forEach基于此更好,但两者具有相似的性能属性,并且使用哪一个取决于特定的用例。

forEach vs Map performance test

答案 1 :(得分:2)

根据 Apple Doc

<强> .MAP

  

map(_ :)方法为每个项目调用一次闭包表达式   数组。您不需要指定闭包输入的类型   参数,数字,因为类型可以从值中推断出来   要映射的数组。

<强> .forEach(_:) Apple Doc

  

在序列中的每个元素上调用给定的闭包   订购为for-in循环。

var myArray = [1,2,3,4]
var sampleArray = [1,2,3,4]
//myArray = myArray.forEach() { ($0 * 2) }//Not allowed
sampleArray = sampleArray.map() { ($0 * 2) }
print("sampleArray array is \(sampleArray)")//sampleArray array is [2, 4, 6, 8]

答案 2 :(得分:-4)

.map比.forEach更快。

只是一头发。请注意,如图所示将.map分配给_会导致闭包不需要返回值。

出现野生编译器优化!

enter image description here