使用变量作为字典键

时间:2017-02-21 18:22:34

标签: swift dictionary

在下面的代码中,我试图创建一个循环来遍历我的字符串,并将字符串中每个字符的值添加到总变量中。

var stringSent = "babbbababa"
let charValues = ["a":1,"b":2]

var total = 0

for i in stringSent.characters{
switch i{
    case "a":
        total += charValues["a"]!
        //adds 1 to total
    case "b":
        total += charValues[i]!
        //throws error
    default:
        print("default was sent")
}
 print(total)
}

最初我打算像这样使用for循环来保持最少的行,如果我能弄清楚如何让变量“i”正确地用作关键来检索当前的话我想做什么字符值。

for i in stringSent.characters {
    total += charValues[i]
}

我的字典出错了还是这种方法不可能?我没有找到任何有用的苹果或谷歌。

2 个答案:

答案 0 :(得分:1)

问题是characters是字符,但字典中的键是字符串。所以只需转换:

let stringSent = "babbbababa"
let charValues = ["a":1,"b":2]

var total = 0

for i in stringSent.characters{
    total += charValues[String(i)]!
}

或者,反过来 - 指定字典中的键应为Characters:

let stringSent = "babbbababa"
let charValues : [Character:Int] = ["a":1,"b":2]

var total = 0

for i in stringSent.characters{
    total += charValues[i]!
}

答案 1 :(得分:1)

您似乎想要计算String实例stringSent中字符的加权总和(给出每个Character的一些已知权重)。您自己实现的问题是,您正在尝试使用与字典键的类型不同的变量来访问字典中键的值(Character不一样作为String

total += charValues[i]! // 'i' is a Character here

您可以简化您的实施,同样避免以几种不同的方式使用显式解包(!),例如将reduce应用于CharacterView

stringSent
var stringSent = "babbbababa"
let charValues = ["a": 1, "b": 2]

let total = stringSent.characters.reduce(0) { $0 + (charValues[String($1)] ?? 0) }
// 16

(关于这个答案的原始误解版本),另一个(稍微浪费一点)替代方案可能是计算String实例stringSent中每个字符的频率,之后相关的权重可以应用于每个频率来计算总加权和。

var stringSent = "babbbababa"
let charValues = ["a": 1, "b": 2]

var freqs: [String: Int] = [:]
stringSent.characters.forEach { freqs[String($0)] = (freqs[String($0)] ?? 0) + 1 }
print(freqs) // ["b": 6, "a": 4]

let total = freqs.reduce(0) { (sum, kv) in
    sum + (charValues[kv.key].map { kv.value*$0 } ?? 0) }
// 16