在Swift数组中,你可以这样做:
var myArray = [1,2,3,4]
myArray.forEach() { print($0 * 2) }
myArray.map() { print($0 * 2) }
他们都做同样的事情。唯一的区别是.map还会返回一个空洞数组[(),(),(),()]
,它会被取消使用。这是否意味着.map在没有分配给任何东西的情况下比.forEach更差?
答案 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
基于此更好,但两者具有相似的性能属性,并且使用哪一个取决于特定的用例。
答案 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)