我正在读取包含Swift结构中键/值行的文本文件。该文件的其中一行在行中有五个以空格分隔的值,我使用componentsSeparatedByString将其转换为数组。
实际值是Ints,因此通常的解决方案是遍历每个并将其复制到我的struct的Int数组中的相关插槽中。但我在这里错过了一些斯威夫特(或基金会)的魔法吗?
答案 0 :(得分:2)
您可以使用map
函数,该函数循环遍历数组的所有元素,并将转换应用于传递给它的闭包中定义的每个元素。
var array = ["2", "4", "6", "8"]
let ints = array.map { $0.toInt()! }
请注意,我在转换为整数时使用强制解包 - 所以如果您100%确定数组中的所有元素实际上是整数,请使用它,否则将生成运行时异常
更安全的方法是映射到可选整数,然后过滤以删除nil值,然后再次映射以强制解包选项:
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)的复杂性 - 尽管我怀疑没有编译器优化它可能会更慢,因为在每次迭代时都会创建一个新数组(如果元素不是nil),因为$0 + [$1!]
。
但很高兴知道有很多方法可以达到相同的结果:)