Swift2 坐标字符串解析

Swift2 坐标字符串解析,swift2,Swift2,嗨,我对斯威夫特比较陌生。我想建立一个数组,其中包含一个数组的元组从字符串如下所示。每个数组中的元组计数并不总是恒定的。最后的数据结构将是: (双倍,双倍)] 要分析的字符串: “((2363448.9 5860581.3,2363438.0 5860577.9),(2363357.5 5860494.7,2363303.2 5860502.0,2363282.5 5860502.5),(2363357.5 5860494.7),(……等)) 我想知道是否有人对最好/最有效的方法有什么想法。我正

嗨,我对斯威夫特比较陌生。我想建立一个数组,其中包含一个数组的元组从字符串如下所示。每个数组中的元组计数并不总是恒定的。最后的数据结构将是: (双倍,双倍)]

要分析的字符串: “((2363448.9 5860581.3,2363438.0 5860577.9),(2363357.5 5860494.7,2363303.2 5860502.0,2363282.5 5860502.5),(2363357.5 5860494.7),(……等))

我想知道是否有人对最好/最有效的方法有什么想法。我正在考虑遍历原始字符串,并根据遇到的字符设置标志。然后为东行和北行构建字符串。但我不确定这是否是最好的方式,而且似乎过于复杂。 效率是一个因素,因为字符串有时可能相当大

--更新 这是我到目前为止的代码,它似乎是有效的。对改进或更好的方法的想法是值得赞赏的,因为代码有点凌乱。感谢迄今为止帮助过我们的每一个人

typealias Coordinate = (easting: Double, northing: Double)
typealias Coordinates = [[Coordinate]]

var array = Array<Array<Coordinate>>() //Array of array of tuples(Double)
var tupleArray = [Coordinate]() //Array of tuples(Double)
var tuple: (Double, Double)! = (0, 0)
var easting: Bool = false
var northing: Bool = false
var eastingString: String = ""
var northingString: String = ""
var openBracket = 0
let tempString = getSubstringFromIndex(wktGeometry , character: "G") //string to parse
for char in tempString.characters {
   if char == "(" {
       openBracket++
       if openBracket == 2 {
           easting = true
       }
   } else if char == ")" {
       openBracket--
       if openBracket == 1 {
           tuple.1 = Double(northingString)!
           tupleArray.append(tuple)
           array.append(tupleArray)
           tupleArray = [Coordinate]()
           eastingString = ""
           northingString = ""
       }
   } else if char == "," {
       if openBracket == 2 {
           tuple.1 = Double(northingString)!
           tupleArray.append(tuple)
           eastingString = ""
           northingString = ""
        }
   } else if char == " " {
       if easting == true {
           tuple.0 = Double(eastingString)!
           easting = false
           northing = true
       } else {
           northing = false
           easting = true
       }
    } else {
        if easting {
            eastingString += String(char)
        } else if northing {
            northingString += String(char)
        }
    } //end if
} //end for
print(array)
typealias坐标=(东距:双精度,北距:双精度)
typealias坐标=[[坐标]]
var array=array()//元组数组的数组(双精度)
var tupleArray=[Coordinate]()//元组数组(双精度)
变量元组:(双精度,双精度)!=(0, 0)
var easting:Bool=false
变量北距:Bool=false
var eastingString:String=“”
var northingString:String=“”
var openBracket=0
让tempString=getSubstringFromIndex(wktGeometry,字符:“G”)//要分析的字符串
对于tempString.characters中的字符{
如果char==”(“{
开放式支架++
如果openBracket==2{
东距=真
}
}如果char==”,则为else{
开放式支架--
如果openBracket==1{
tuple.1=Double(北字符串)!
tupleArray.append(tuple)
array.append(tupleArray)
tupleArray=[坐标]()
eastingString=“”
northingString=“”
}
}如果char==”,则为else{
如果openBracket==2{
tuple.1=Double(北字符串)!
tupleArray.append(tuple)
eastingString=“”
northingString=“”
}
}如果char==“”,则为else{
如果东距==真{
tuple.0=Double(东字符串)!
东距=假
北距=真
}否则{
北距=假
东距=真
}
}否则{
如果向东{
eastingString+=字符串(字符)
}否则,如果北行{
northingString+=字符串(字符)
}
}//如果结束,则结束
}//结束
打印(数组)

基本上
[[2363448.9 5860581.3,2363438.0 5860577.9],[2363357.5 5860494.7,2363303.2 5860502.0],[2363282.5 5860502.5,2363357.5 5860494.7],
将使用上面提到的JSON代码。除此之外,您还可以使用一个变量来存储它们,并在使用append时添加它们。除非您拥有的是一个常量,否则它看起来肯定会更干净。

代码的问题在于您试图同时完成所有操作。如果将任务拆分为几个小的子任务,则会变得简单得多:

// will parse "2363448.9 5860581.3"
func parseCoordinate(coordinateString: String) -> (Double, Double) {
   // possible implementation:
   // 1. split string by space,
   // 2. assert there are two components
   // 3. parse them to Doubles and return them
}

// will parse "(2363448.9 5860581.3, 2363438.0 5860577.9)"
func parseCoordinates(coordinatesString: String) -> [(Double, Double)] {
   // possible implementation:
   // 1. remove last character "(" and end character ")"
   // 2. split the string by "," + remove spaces around results
   // 3. call parseCoordinate for every result (e.g. using "map" method)
}

// will parse your whole string
func parse(string: String) -> [[(Double, Double)]] {
   // possible implementation
   // 1. Use a smart regular expression to split by "," not inside "(" and ")" or just by string "), ("
   // 2. call parseCoordinates for every result (e.g. using "map" method)
} 
最重要的是:

  • 字符串拆分(请参阅)
  • Array.map
    方法

  • 这几乎就是JSON。如果您交换了
    ->
    [
    ->
    ]
    ,您可以使用内置的JSON解析代码。好的,非常感谢我会查找它。@特洛伊木马程序执行此操作后,您将得到
    [[2363448.9 58605881.3,2363438.0 5860577.9],…
    这将不是有效数组(缺少逗号).@Eric.同意;错过了。好的,非常感谢我将查找link和Array.map。是的,我同意我的写作方式有点混乱,如果所有案例都涵盖在内的话,可能会出现bug。