2016-12-14 3 views
0

Я пытаюсь преобразовать строку следующего формата в массив (... массивов, поплавков!) В Swift 3:Строка в массив в Swift 3

"[173.0, 180.5],[173.0, 180.0],[174.0, 180.5],[174.0, 183.0]" 

так, что выход будет быть массив в следующем формате:

[[173.0, 180.5, 173.0, 180.0],[174.0, 180.5, 174.0, 183.0]] 

Я действительно новый Swift и изо все сил, чтобы найти какую-либо функцию String, которая позволит мне преобразовать данные таким образом. Любые указатели на то, как я могу это сделать, будут потрясающе - спасибо!

+1

заключите строку в квадратных скобках, а затем интерпретировать это как JSON ... –

+0

@Rosie, откуда берется эта строка? – Alexander

+0

@ Rosie, также что с выходом формата? Вход представляет собой 4 массива по 2 элемента, каждый из которых состоит из 2 массивов по 4 элемента? – Alexander

ответ

0

Одним из вариантов является использование старой школы NSScanner для извлечения числа из строки в плоский массив, а затем построить 2 одномерный массив выключения, что:

let str = "[173.0, 180.5],[173.0, 180.0],[174.0, 180.5],[174.0, 183.0]" 
let scanner = Scanner(string: str) 
scanner.charactersToBeSkipped = CharacterSet(charactersIn: "[], ") 

// Build the flat array 
var numbers = [Double]() 
while !scanner.isAtEnd { 
    var d = 0.0 
    if scanner.scanDouble(&d) { 
     numbers.append(d) 
    } 
} 

// Now the 2 dimensional array 
let result = stride(from: 0, to: numbers.count, by: 4).map { startIndex -> [Double] in 
    let endIndex = min(startIndex + 4, numbers.count) 
    return Array(numbers[startIndex..<endIndex]) 
} 
0

Одним из вариантов преобразования типов данных было бы разработать простой алгоритм, который будет выполнять итерацию по строке и анализировать элементы и разделители квадратной скобки, возвращая соответствующее преобразование.

Ниже приведена скелет о том, как могут выглядеть фундаментальные компоненты такой функции. Включены некоторые основные аспекты преобразования из строки в массив.

var str = "[173.0, 180.5], [173.0, 180.0],[174.0, 180.5],[174.0, 183.0]" 

// Cast returns array ["[","1","7","3",".","0",",".......] 
let array = Array(str.characters) 

// Iterate through array 
for char in array { 

    if char == "[" || char == "]" { 
     // Deal with array delimiters appropriately 
    } 

    ... 

} 

Возможно, это поможет проверить this Аналогичная проблема.

ПРИМЕЧАНИЕ: Как упоминал Мартин R, интерпретация JSON может быть хорошим методом.

1

Как сказал Мартин, сначала нужно сначала преобразовать это из строки в массив. В Swift 3:

let string = "[173.0, 180.5],[173.0, 180.0],[174.0, 180.5],[174.0, 183.0]" 
let jsonString = "[" + string + "]" 

guard let data = jsonString.data(using: .utf8), 
    let json = try? JSONSerialization.jsonObject(with: data), 
    let numberPairs = json as? [[Double]] else { 
     fatalError("string was not well-formed: \(string)") 
} 

Затем вы хотите, чтобы объединить эти пары чисел вместе:

var combinedNumbers = [[Double]]() 
var current: [Double]? 
for numberPair in numberPairs { 
    if current != nil { 
     combinedNumbers.append(current! + numberPair) 
     current = nil 
    } else { 
     current = numberPair 
    } 
} 

// use `combinedNumbers` here 

Очевидно, что вы должны лучше использовать имена переменных (возможно, что-то, что предполагает, что эти наборы чисел), но, надеюсь, это иллюстрирует эту идею.