Swift 使用变量作为字典键

Swift 使用变量作为字典键,swift,dictionary,Swift,Dictionary,在下面的代码中,我试图创建一个循环,该循环将遍历我的字符串,并将字符串中每个字符的值添加到total变量中 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

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

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)
}
最初,我打算使用一个类似于so的for循环来将行数保持在最少,如果我能够弄清楚如何将变量“I”正确地用作检索当前字符值的键,我希望这样做

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

我的字典有问题吗?或者这种方法不可行吗?我还没有从苹果或谷歌那里找到任何有用的东西。

问题是
字符
是字符,但字典中的键是字符串。因此,只需转换:

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

var total = 0

for i in stringSent.characters{
    total += charValues[String(i)]!
}
或者,换一种方式-指定字典中的键应为字符:

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

var total = 0

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

问题是
字符
是字符,但字典中的键是字符串。因此,只需转换:

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

var total = 0

for i in stringSent.characters{
    total += charValues[String(i)]!
}
或者,换一种方式-指定字典中的键应为字符:

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

var total = 0

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

似乎要计算
字符串
实例
stringSent
中字符的加权和(给定每个
字符
的一些已知权重)。您自己的实现中的问题是,您试图使用一个变量来访问字典中某个键的值,该变量与字典的键的类型不同(
字符
字符串
不同)

您可以简化实现,同样避免以几种不同的方式使用显式展开(
),例如,将
reduce
应用于
stringSent
字符视图

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

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

(关于这个答案最初被误解的版本),另一个(稍微浪费一点的)替代方法是计算
字符串
实例
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

似乎要计算
字符串
实例
stringSent
中字符的加权和(给定每个
字符
的一些已知权重)。您自己的实现中的问题是,您试图使用一个变量来访问字典中某个键的值,该变量与字典的键的类型不同(
字符
字符串
不同)

您可以简化实现,同样避免以几种不同的方式使用显式展开(
),例如,将
reduce
应用于
stringSent
字符视图

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

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

(关于这个答案最初被误解的版本),另一个(稍微浪费一点的)替代方法是计算
字符串
实例
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

由于不熟悉reduce,我将稍后在apples文档中阅读它。感谢您不熟悉reduce,稍后我将在Apple文档中阅读它。非常感谢您的回答,我感觉它们不是相同的数据类型,我尝试将字典更改为[Character:Int],但我没有“!”所以它不会做任何事情。非常感谢您的回答,我感觉它们不是相同的数据类型,我尝试将字典更改为[Character:Int]但是我没有“!”所以它什么也做不了。