Swift 使用变量作为字典键
在下面的代码中,我试图创建一个循环,该循环将遍历我的字符串,并将字符串中每个字符的值添加到total变量中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
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]但是我没有“!”所以它什么也做不了。