2016-12-14 59 views
0

我想以下格式的字符串轉換成一個數組(...陣列,浮標!)的斯威夫特3:字符串到數組中的斯威夫特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非常陌生,並且很難找到任何能夠以這種方式轉換數據的字符串函數。任何關於我如何做到這一點的指針都會很棒 - 謝謝!

+1

括字符串在方括號中,然後解釋它作爲JSON ... –

+0

@Rosie那個字符串從哪裏來的? – Alexander

+0

@Rosie,輸出格式又是怎樣?輸入是每個2個元素的4個數組,每個輸出是4個元素的2個數組? – 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類似的問題。

注意:正如Martin R所說,JSON解釋也可能是一個好方法。

1

正如Martin所說,您首先想要先將其從字符串轉換爲數組。在斯威夫特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 

顯然,你應該使用更好的變量名(或許有些建議是什麼,這些組數字是)但希望這可以說明這個想法。