У меня есть строка со списком координат, которые мне нужно преобразовать в массив. Я пытался сделать let array = Array(coordinates), но там говорится, что String больше не соответствует SequenceType. Мне нужно преобразовать строку в массив CLLocations. Строка, которую я пытаюсь преобразовать, выглядит следующим образом:

let coordinates = "[[39.86475483576405,-75.53281903266907], [39.864688955564304,-75.53292632102966], [39.86455719497505,-75.53300142288208], [39.86440072894666,-75.5330228805542], [39.8642689678039,-75.53295850753784], [39.863305456757146,-75.53223967552185], [39.86303369478483,-75.53266882896423]]"
1
SmedleyDSlap 25 Апр 2017 в 05:50

2 ответа

Лучший ответ

Строка является допустимой строкой JSON.

Самый простой способ - десериализовать строку с помощью JSONSerialization и отобразить результат в [CLLocation]

let coordinates = "[[39.86475483576405,-75.53281903266907], [39.864688955564304,-75.53292632102966], [39.86455719497505,-75.53300142288208], [39.86440072894666,-75.5330228805542], [39.8642689678039,-75.53295850753784], [39.863305456757146,-75.53223967552185], [39.86303369478483,-75.53266882896423]]"

if let data = coordinates.data(using: .utf8),
    let jsonArray = try? JSONSerialization.jsonObject(with: data) as? [[Double]] {
    let locationArray  = jsonArray!.map{CLLocation(latitude:$0[0], longitude:$0[1]) }
    print(locationArray)

}
3
vadian 25 Апр 2017 в 04:19

Один из подходов состоит в том, чтобы убрать все скобки и пробелы, а затем разделить запятые числа в массив. Затем преобразуйте каждую пару числовых строк в числа и, наконец, создайте CLLocation из пары чисел.

// Your string
let coordinates = "[[39.86475483576405,-75.53281903266907], [39.864688955564304,-75.53292632102966], [39.86455719497505,-75.53300142288208], [39.86440072894666,-75.5330228805542], [39.8642689678039,-75.53295850753784], [39.863305456757146,-75.53223967552185], [39.86303369478483,-75.53266882896423]]"
// Remove the brackets and spaces
let clean = coordinates.replacingOccurrences(of: "[\\[\\] ]", with: "", options: .regularExpression, range: nil)
// Split the comma separated strings into an array
let values = clean.components(separatedBy: ",")
var coords = [CLLocation]()
for i in stride(from: 0, to: values.count, by: 2) {
    // Pull out each pair and convert to Doubles
    if let lat = Double(values[i]), let long = Double(values[i+1]) {
        let coord = CLLocation(latitude: lat, longitude: long)
        coords.append(coord)
    }
}
1
rmaddy 25 Апр 2017 в 03:33
43600762