在下面的代码中,我试图创建一个循环来遍历我的字符串,并将字符串中每个字符的值添加到总变量中。
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]
}
我的字典出错了还是这种方法不可能?我没有找到任何有用的苹果或谷歌。
答案 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