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有效点,请随意添加带有这些细节的答案。最终,询问者应该能够选择适合他们需求的最佳解决方案,因此解决方案越多越好:)