在Swift

时间:2016-01-30 19:44:33

标签: string swift

我有一个文本文件,其中包含以下格式的一系列字符串参数:

# name:test name visible:false ignore:false comment:this is a comment

参数可以是任何顺序,它们可以有任何名称,包括我不知道的名称。我想将这些解析成字典。使用传统的字符串处理我会这样做:

  1. 查找字符串中的第一个冒号
  2. 从该点向后看第一个空格或字符串开头
  3. 参数名称介于这两个点之间
  4. 在下一个冒号或字符串结尾
  5. 之后查看
  6. 从那一点向后看第一个空格字符
  7. 参数值介于这两点之间
  8. 从字符串中删除所有文本,然后重复
  9. 在Swift下,所有这些看起来都非常困难。其中很大一部分原因是Apple几乎完全缺乏文档和示例。我知道我可以使用rangeOfString来查找冒号,但我遗失了如何找到 next 冒号或之前的空间。即使这样,使用范围中的信息来剪切各个位似乎也很困难。我找到了一些帮助程序代码,但它完全适用于Swift 1.0,并且不再适用于Swift 2。

    那么,是否有人指出了一系列用于执行此类操作的常规例程,或者有关如何执行该操作的建议?

1 个答案:

答案 0 :(得分:2)

格式不是IOS上常用的格式之一,但可以通过一些转换来处理:

var dict:[String:String] = [:]

let line = "name:test name visible:false ignore:false comment:this is a comment"

// The process:
// - separate components on spaces
// - re-combine using \n before elements containing ":" and restoring spaces for others
// - separate into array of key:value (now separated by \n)
// - remove empty element before first key:value pair
// - separate each key:value into a two element array
// - assign values to keys in dictionary
//
line.componentsSeparatedByString(" ")               
    .reduce("", combine: { $0 + ($1.containsString(":") ? "\n" : " ") + $1 })
    .componentsSeparatedByString("\n")
    .filter({ $0 != "" })
    .map({ $0.componentsSeparatedByString(":") })
    .forEach({ dict[$0.first!] = $0.last })

//   dict will contain :
//
//   visible:false
//   comment:this is a comment
//   ignore:false
//   name:test name