Arrays 是否将字符串数组复制到整数数组?

Arrays 是否将字符串数组复制到整数数组?,arrays,swift,Arrays,Swift,我正在将包含键/值行的文本文件读入Swift结构。文件的其中一行中有五个空格分隔的值,我使用ComponentSeparatedByString将其转换为一个数组 实际值是Int,因此通常的解决方案是循环每个值,并将其复制到我的结构的Int数组中的关联插槽中。但是我缺少了一些快速(或基础)的魔法吗?您可以使用map函数,它循环遍历数组的所有元素,并对传递给它的闭包中定义的每个元素应用转换 var array = ["2", "4", "6", "8"] let ints = array.map

我正在将包含键/值行的文本文件读入Swift结构。文件的其中一行中有五个空格分隔的值,我使用ComponentSeparatedByString将其转换为一个数组


实际值是Int,因此通常的解决方案是循环每个值,并将其复制到我的结构的Int数组中的关联插槽中。但是我缺少了一些快速(或基础)的魔法吗?

您可以使用
map
函数,它循环遍历数组的所有元素,并对传递给它的闭包中定义的每个元素应用转换

var array = ["2", "4", "6", "8"]

let ints = array.map { $0.toInt()! }
请注意,我在转换为整数时使用强制展开-因此,如果100%确定数组中的所有元素实际上都是整数,请使用强制展开,否则将生成运行时异常

更安全的方法是映射到可选整数,然后过滤以删除零值,然后再次映射以强制展开选项:

let ints = array.map { $0.toInt() }.filter { $0 != nil }.map { $0! }
请注意,这个更安全的版本可能看起来比使用
for
循环慢(实际上是这样,因为它遍历数组3次——除非编译器能够优化它)——但我更喜欢它而不是循环,因为它更紧凑,在我看来更可读。不用说,我可能不会使用大型阵列

附录:根据@MikeS的建议,可以使用
reduce
来组合更安全版本的最后两个步骤:

let ints = array.map { $0.toInt() }.reduce([]) { $1 != nil ? $0 + [$1!] : $0 }
对于小型数组来说,它似乎是一个很好的选择,因为它将复杂性从O(3n)降低到O(2n)-尽管我怀疑如果没有编译器优化,它可能会更慢,因为在每次迭代中都会创建一个新数组(如果元素不是零),因为
$0+[$1!]


但是很高兴知道有很多方法可以达到同样的效果:)

这就是我为什么问的原因。非常有用@Antonio您可以通过使用
reduce
而不是
filter
map
删除
nil
s:
let ints=array.map{$0.toInt()}.reduce([]){$1!=nil?$0+[$1!]:$0}
。你也可以使用
reduce
来进行初始映射,但是你基本上回到了
for
循环,我想不出一种方法来作为一个线性循环。谢谢@MikeS-作为替代解决方案添加-如果你同意我的建议,请告诉我considerations@Antonio是 啊我同意在每次迭代中创建额外的数组可能会减慢速度;我找不到将单个元素附加到不可变数组的方法。总的来说,我认为您的
映射
过滤器
映射
解决方案可能会更好(当然对于小数组),如果不是因为可读性以外的原因。@MikeS但是如果nil元素的数量大于非nil元素,您的解决方案可能会更好,特别是对于基本数据类型(Int、Float等)。