有没有一种简单的方法可以遍历多维数组并在Swift中转换每个元素



如果我有一个纬度和经度的多维数组,比如:

let inputLatLongArray = [[[
["-100.7777777775", "99.2222222"],
["-100.777777777", "87.2222222"],
["-100.777777777",  "34.2222222"],
["-100.777777777", "99.2222222"],
["-100.777777777", "99.2222222"]
]]]

我怎样才能遍历&转换元素,使每个嵌套的lat/long只有两位小数?

预期输出:

let expectedLatLongArray = [[[
["-100.77", "99.22"],      
["-100.77", "87.22"], 
["-100.77", "34.22"], 
["-100.77", "99.22"], 
["-100.77", "99.22"]
]]]

代码:

以下是我目前所掌握的内容。我的想法是使用flatMap,然后向下映射到嵌套数组中,但这似乎也不正确。有简单的方法吗?

func roundLatAndLong(with latLongArray: [[[[String, String]]]]) -> [[[[String, String]]]] {
let coordinates = latLongArray.flatMap { $0 }.map({ $0 }).map({ //Rounded both array positions down to 2 decimal places })
return coordinates
}
func rounded(toDecimalPlaces n: Int) -> String {
return String(format: "%.(n)f", self)
}

如果您的数据类型是Double,则没有小数位数。如果你试图将一个值四舍五入到给定的小数位数,你会得到一个接近但不完全是该值的值。这是因为二进制浮点不能准确地表示大多数十进制值。如果您真的想将值转换为具有精确小数位数的值,则应该使用Decimal类型。

您可以很容易地将lat/long Double值的数组转换为具有给定小数位数的字符串。

如果你有一个包含lat/long的结构数组,或者一个元组数组,它会干净得多。或者甚至是一组关键字为"的字典;lat";以及";"长";

您可以这样做:

func nestedTransform<InElement, OutElement>(nested: [[[[InElement]]]], transform: (InElement) -> OutElement) -> [[[[OutElement]]]]
{
return nested.map {$0.map { $0.map { $0.map(transform) }}}
}

我认为在您的尝试中,您只是稍微偏离了嵌套,也就是说,您是在链接而不是嵌套map调用。

你可以这样使用:

let roundedResult = nestedTransform(nested: inputLatLongArray) { $0.rounded(toDecimalPlaces: 8) }

假定在CCD_ 3上存在一个适当的扩展。您编辑了问题以删除原始Double数组。因此,这个答案有助于解决嵌套数组的映射问题。转换的实现由您决定!

我也强烈鼓励你阅读@DuncanC的答案和@LeoDaubus关于为什么你最初的转换是不明智的评论。

您可以逐步扩展Array以允许对多维对象进行转换:

extension Array {
func map2<T, U>(_ transform: (T) -> U) -> [[U]] where Element == [T] {
map { $0.map(transform) }
}

func map3<T,U>(_ transform: (T) -> U) -> [[[U]]] where Element == [[T]] {
map { $0.map2(transform) }
}

func map4<T,U>(_ transform: (T) -> U) -> [[[[U]]]] where Element == [[[T]]] {
map { $0.map3(transform) }
}
}

然后你可以使用这样的扩展:

let inputLatLongArray = [[[
["-98.73264361706984", "38.5447223260328"],
["-98.73255257987707", "38.543630550793544"],
["-98.7302159585956",  "38.54506646913993"],
["-98.73200635672036", "38.54556488037536"],
["-98.73264361706984", "38.5447223260328"]
]]]
let transform: (String) -> String = {
return String(format: "%.(8)f", Double($0) ?? 0.0)
}
let transformedArray = inputLatLongArray.map4(transform)
print(transformedArray)

最新更新