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

Ios 有没有一种简单的方法可以遍历多维数组并在Swift中转换每个元素?,ios,swift,Ios,Swift,如果我有一个纬度和经度的多维数组,比如: let inputLatLongArray = [[[ ["-100.7777777775", "99.2222222"], ["-100.777777777", "87.2222222"], ["-100.777777777", "34.2222222"], ["-100.777777777",

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

let inputLatLongArray = [[[
  ["-100.7777777775", "99.2222222"],
  ["-100.777777777", "87.2222222"],
  ["-100.777777777",  "34.2222222"],
  ["-100.777777777", "99.2222222"],
  ["-100.777777777", "99.2222222"]
 ]]]
如何遍历和转换元素,使每个嵌套的lat/long只有2位小数

预期产出:

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

以下是我到目前为止得到的信息。我的想法是使用平面映射,然后映射到嵌套数组中,但这似乎也不正确。有没有一个简单的方法可以做到这一点

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双精度值数组转换为具有给定小数位数的字符串


如果您有一个包含lat/long的结构数组,或者一个元组数组,那么它会更干净。或者甚至是一组带有“lat”和“long”键的字典,您可以这样做:

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)
func嵌套转换(嵌套:[[[[InElement]]],转换:(InElement)->OutElement)->[[[[OutElement]]]
{
返回nested.map{$0.map{$0.map{$0.map(转换)}}
}
我想在你的尝试中,你只是把你的嵌套弄得有点不对劲,那就是你是在链接而不是嵌套
map
调用

您可以这样使用它:

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)
let roundedResult=nestedTransform(nested:inputLatLongArray){$0.rounded(toDecimalPlaces:8)}
假设存在
inement
上的适当扩展。您编辑了问题以删除原始的
Double
数组。所以这个答案可以用来解决嵌套数组的映射问题。转换的实现取决于您


我还强烈建议您阅读@Duncac的答案和@LeoDaubus的评论,了解为什么您的原始转换是不明智的。

您可以逐步扩展
数组
,以允许在多维数组上进行转换:

扩展数组{
func-map2(U-transform:(T)->U)->[[U]]其中元素==[T]{
映射{$0.map(transform)}
}
func-map3(U-transform:(T)->U)->[[[U]]]其中元素==[[T]]{
映射{$0.map2(转换)}
}
func-map4(U-transform:(T)->U)->[[[U]]]]其中元素==[[T]]{
映射{$0.map3(转换)}
}
}
然后,您可以像这样使用扩展:

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)

嵌套数组是一种非常糟糕的存储方式。我建议你重新考虑一下你的数据模型!例如,如果有一对表示纬度和经度的双精度体,则使用
纬度
经度
属性创建坐标结构。等等。不幸的是,它就是这样交给我的。编程不是这样工作的。玉石碑上没有写任何东西。请不要故意破坏你的问题。社区中有三位声望很高的成员花了时间和精力回答了你的问题,然后故意破坏这个问题并使他们的答案过时,这是非常不礼貌的。你的意思是什么时候对他们进行反序列化?(将它们从JSON转换为对象?@LocalSwiftGuy为什么需要丢弃分数数字?您可以在显示itI时简单地格式化它们,这样我就不用担心了。与以字符串形式存储不同,将其存储为double不存在具有特定小数位数的二进制浮点数。二进制浮点不是这样工作的。您需要将值保存为核心数据中的字符串,或将其保存为双精度值,并将其格式化为所需的显示位置数。这似乎是一个注释,而不是答案。但我不可能把它挂起来。回答者享有上帝般的声誉。我不知道op在哪里提到使用double。也许这是一个糟糕的问题,因此可以发布一条评论作为答案?在我看来,所有元素都在一个由2个元素组成的集合中。我只需将它连接两次,然后将第三个映射为两个双元组。如果需要,OP可以将纬度和经度映射到CLLocationCoordinate2D中。降低纬度和经度的精度是没有意义的。OP应将其存储为双精度格式,并在显示时对其进行格式化
let coordinates=inputlongarray.joined().joined().map{(Double($0[0])!,Double($0[1])}
用于坐标中的坐标。map(CLLocationCoordinate2D.init){
打印(坐标)
我还要提到
[[[[String,String]]]]]]
它是无效的type@LeoDabus有效点,请随意添加带有这些细节的答案。最终,询问者应该能够选择适合他们需求的最佳解决方案,因此解决方案越多越好:)