在Swift中将字符串减少为字典

Sep*_*miu 1 arrays dictionary swift swift2

什么是一个简单的方法来减少像AAA:111;BBB:222;333;444;CCC:555Swift中的字典一样的字符串.我有以下代码:

var str = "AAA:111;BBB:222;333;444;CCC:555"
var astr = str.componentsSeparatedByString(";").map { (element) -> [String:String] in
    var elements = element.componentsSeparatedByString(":")
    if elements.count < 2 {
        elements.insert("N/A", atIndex: 0)
    }
    return [elements[0]:elements[1]]
}
Run Code Online (Sandbox Code Playgroud)


上面的代码产生一个阵列字典:
[["A": "111"], ["BBB": "222"], ["UKW": "333"], ["UKW": "444"], ["CCC": "555"]]

我希望它能产生,
["A": "111", "BBB": "222", "UKW": "333", "UKW": "444", "CCC": "555"]

但是没有我尝试的东西,因为我map在一个数组上调用函数似乎不可能转换map函数结果的性质.

注意:字符串格式的字典被描述为具有KEY:VALUE;格式或VALUE;格式,在这种情况下,映射函数将添加"N/A"as作为未命名值的键.

非常感谢任何有关此事的帮助.

Cod*_*ent 7

map会产生一系列字典.当你想把它们组合成1时,这是一个完美的工作reduce:

func + <K,V>(lhs: Dictionary<K,V>, rhs: Dictionary<K,V>) -> Dictionary<K,V> {
    var result = Dictionary<K,V>()

    for (key, value) in lhs {
        result[key] = value
    }
    for (key, value) in rhs {
        result[key] = value
    }

    return result
}

var str = "AAA:111;BBB:222;333;444;CCC:555"
var astr = str
    .componentsSeparatedByString(";")
    .reduce([String: String]()) {
        aggregate, element in
        var elements = element.componentsSeparatedByString(":")
        if elements.count < 2 {
            elements.insert("N/A", atIndex: 0)
        }
        return aggregate + [elements[0]:elements[1]]
    }

print(astr)
Run Code Online (Sandbox Code Playgroud)

Swift没有默认操作符来"组合"两个,Dictionaries所以你必须定义一个.请注意,+这里不是可交换的:dictA + dictB != dictB + dictA.如果两个字典中都存在密钥,则将使用第二个字典中的值.

  • 这很好,但是你用'+'操作让它变得非常复杂.根本不需要. (2认同)