2016-07-17 7 views
0

Я новичок в Swift и iOS dev. в целом. Мне было интересно, как я могу суммировать несколько значений из одного и того же ключа в разных словарях. например У меня естьКак можно суммировать несколько значений из одного и того же ключа в разных словарях в swift?

20 словарей с одинаковой парой значений ключа [String: AnyObject], например. «Высота»: 20 Я хочу их суммировать и рассчитать среднее. EG:

// Example dictionary 
let player17: [String: AnyObject] = [ 
    "Name": "Les Clay", 
    "Height": 42, 
    "Soccer Experience": true, 
    "Guardian Name(s)": "Wynonna Brown" 
] 

// Используется любой объект здесь, как и все они идут в большой массив

+1

Являются ли ваши 20 словарей сами по себе содержащимися внутри какого-либо контейнера? Если вы хотите выполнять общую работу с данными, содержащимися в разных словарях, возможно, вставьте словари в один словарь или массив. Кроме того, в качестве альтернативы использованию 'String: AnyObject' dict., Учитывая, что разные _types_ данных игрока несколько статичны (известны во время компиляции), рассмотрите возможность определения данных вашего игрока как членов экземпляра' struct' (следовательно, не необходимо работать с 'AnyObject'). – dfri

+0

Да забыл сидеть, они все в массиве под названием allPlayers –

ответ

1

Вы можете использовать reduce, чтобы добавить номера вверх, как это:

let totalHeight = allPlayers.reduce(0) { (p, c) -> Int in 
    return p + (c["Height"] as! Int) 
} 

Примечание: Подход c["Height"] as! Int требует жесткого знания того, что "Height" ключ присутствует в каждом словаре, а его значение имеет тип Int. В противном случае это приведет к возникновению исключения во время выполнения.

Если некоторые из ваших словарей не имеют правильный ключ в них, или содержать значение другого типа, вам необходимо предварительно фильтр или использовать дополнительный оттенок, например

return p + ((c["Height"] as? Int) ?? 0) 
+0

@dfri Просто пробует это на детской площадке, работает как шарм. – dasblinkenlight

+0

@dfri Вот ссылка [ссылка на pastebin] (http://pastebin.com/mzTtTprc), если вы хотите попробовать. – dasblinkenlight

+1

@dfri: Это потому, что ваш массив содержит * пустой словарь *, для которого 'c [" Height "] == nil'. –

1

Учитывая

let players: [[String:AnyObject]] = ... 

здесь другой подход

let sum = players.flatMap { $0["Height"] as? Int }.reduce(0, combine: +) 

Если словарь не имеет действительного значения Int для ключа "Height", тогда этот словарь игнорируется.

Смежные вопросы