2017-02-21 5 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) 
} 

Первоначально я собирался использовать цикл, как так, чтобы строки в наималейшем количество, которое я хотел бы сделать, если я могу понять, как получить переменный «я», чтобы правильно использовать в качестве ключа для возврата значения текущих символов.

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

Я делаю что-то не так с моим словарем или этот метод невозможен? Я не нашел ничего полезного из Apple или Google.

ответ

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). Проблема в собственной реализации является то, что вы пытаетесь получить доступ к значению ключа в словаре, используя переменную, которая отличается от типа ключа dictionariy (в 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 

(Что касается оригинальной версии непонятого этого ответа), другой (чуть более расточительно) Альтернативой может быть, чтобы вычислить частоты каждого символа в экземпляре StringstringSent, после чего связанный вес может быть применен к каждой частоте для вычисления общей взвешенной суммы.

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

Не знаком с сокращением, я буду читать на нем документацию на ящики позже. благодаря – CogHead