【问题标题】:Extract a String to array of CGPoints in Swift在 Swift 中将字符串提取到 CGPoints 数组
【发布时间】:2021-09-08 16:12:45
【问题描述】:

我有一个包含数千个地理坐标列表的字符串

“[8.2627925,46.3460497],[8.2612673,46.3457009],[8.2602494,46.3453934],...”

并希望将它们全部提取到 CGPoints 数组中。 我今天使用的代码如下:

let coords=[CGPoint]()
while substring.contains("[")
{
      index = substring.index(of: "[")!
      substring = substring[index...]
                                
      index = substring.index(of: "]")!
      let coordinate = substring[..<index]
      var indexComma = coordinate.index(of: ",")!
      let coordX = String(coordinate[..<indexComma])
      indexComma = coordinate.index(indexComma, offsetBy: +1)
      let coordY = String(coordinate[indexComma...])
      coords.append(CGPoint(x: CGFloat(Double(coordX)!), y: CGFloat(Double(coordY)!)))
      substring = substring[index...]
 }

但是我确信它可以优化,可能使用正则表达式。什么是最有效的方法?

【问题讨论】:

  • 看起来几乎像 JSON,如果你用 "[""] 括起来的话。我会先这样解码......你真的需要正则表达式吗?否则:let arrayOfPoints = try? JSONDecoder().decode([[Double]].self, from: Data(("[" + pointsStr + "]").utf8); let arrayOfCGPoints = arrayOfPoints.map { CGPoint(x: $0[0], y: $0[1]) }
  • 看起来不像,但如果这是有效的 GeoJSON,您可以使用 MKGeoJSONDecoder 解析它
  • 1.一次删除所有 [ 和 ] 实例。 2. 获取以逗号分隔的组件数组。 3. 遍历数组并将每个元素保存在坐标中。
  • 有人能帮我理解为什么减票吗?

标签: arrays swift string


【解决方案1】:

一种更有效的方法是使用 json 序列化。 Json 无法序列化您的字符串,因为它的格式不正确,因此您可以插入“[”和“]”进行序列化,如下所示

 var coordinates = "[1.3123,3.2131],[2.3123,4.213]"
 coordinates.insert("[", at: coordinates.startIndex)
 coordinates.insert("]", at: coordinates.endIndex)

现在,我们的数据已经准备好进行序列化了。那么最简单的部分就是将指针附加到CGPoint数组

 var points : [CGPoint] = []
 if let data = coordinates.data(using: .utf8),
      let jsonArray = try? JSONSerialization.jsonObject(with: data) as? [[Double]] {
        points.append(contentsOf: jsonArray.map{CGPoint(x: $0[0], y: $0[1]) })
        print(points)

    }

您可以轻松访问您的数据

print(points[0].x) // 1.3123
print(points[1].y) // 4.213

【讨论】:

  • let data = Data(coordinates.utf8) 会避开你if let ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2023-03-27
  • 2021-06-13
  • 1970-01-01
相关资源
最近更新 更多