【问题标题】:String into array in Swift 3在 Swift 3 中将字符串转换为数组
【发布时间】:2016-12-14 18:15:45
【问题描述】:

我正在尝试将以下格式的字符串转换为 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 函数。任何关于我如何做到这一点的指示都会很棒 - 谢谢!

【问题讨论】:

  • 将字符串括在方括号中,然后将其解释为 JSON ...
  • @Rosie 那个字符串是从哪里来的?
  • @Rosie,输出格式又是怎么回事?输入是 4 个数组,每个数组包含 2 个元素,输出是 2 个数组,每个数组包含 4 个元素?

标签: arrays swift string


【解决方案1】:

正如 Martin 所说,您首先要先将其从字符串转换为数组。在 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

显然,您应该使用更好的变量名称(也许可以暗示这些数字集是什么),但希望这能说明这个想法。

【讨论】:

    【解决方案2】:

    斯威夫特 4

    你可以使用Decodable:

    let str = "[173.0, 180.5],[173.0, 180.0],[174.0, 180.5],[174.0, 183.0]"
    let json = "[\(str)]".data(using: .utf8)!
    
    let numbers = try JSONDecoder().decode([[Double]].self, from: json).flatMap { $0 }
    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])
    }
    

    斯威夫特 3

    一种选择是使用老式的NSScanner 将字符串中的数字提取到一个平面数组中,然后构建一个二维数组:

    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])
    }
    

    【讨论】:

      【解决方案3】:

      转换数据类型的一个选项是开发一种简单的算法,该算法将遍历字符串并分析元素和方括号分隔符,返回适当的转换。

      下面是这样一个函数的基本组件的骨架。 包括从字符串到数组的转换的一些基本方面。

      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 解释也可能是一个很好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-07
        • 2016-07-13
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        相关资源
        最近更新 更多