2017-02-21 11 views
0

以下のコードでは、文字列内の各文字の値を合計変数に加算するループを作成しようとしていました。変数を辞書キーとして使用する

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) 
} 

当初、私は、「i」が正しくキーとして使用されるように、私は、変数を取得する方法を見つけ出すことができれば、私はやってみたいどの最も少ないのラインを保つためにそうのようなforループを使用するつもりでした現在の文字値を取得します。

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

私の辞書には何か問題がありますか、この方法はできませんか?私は、リンゴかグーグルの助けを借りて何かを見つけました。

答えて

1

問題はcharactersが文字ですが、辞書のキーは文字列です。だから変換:

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]! 
} 
+0

はこの答えをどうもありがとうございます、私は彼らが同じデータ型をしゃべれなかった気持ちを持っていた、私は[文字:INT]に辞書を変更してみましたが、私は持っていませんでし「を!」それは何もしませんでした。 – CogHead

1

あなたの中の文字の加重和を計算したいようですStringインスタンスstringSent(それぞれCharacterの既知の重みがあります)。独自の実装に問題が

total += charValues[i]! // 'i' is a Character here 
CharacterStringと同じではありません)あなたはdictionariyのキーのタイプとは異なり、変数を使用して、辞書内のキーの値にアクセスしようとしているということです

あなたの実装を単純化することができ、同様にいくつかの異なる方法で明示的なアンラッピング(!)を使用することを避けることができます。 (この回答のオリジナル誤解バージョンに関して)CharacterViewstringSent

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

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

reduceを適用し、別の(やや無駄な)選択肢は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 
+1

reduceについて詳しくはありませんが、あとでAppleのドキュメントでそれを読み上げます。ありがとう – CogHead

関連する問題