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