2015-06-19 2 views
3

Я начинаю стремительно, и я пытаюсь понять понятие словарей.Как совместить два NSDictionary в Swift

У меня есть два NSDictionary, что оба содержат одни и те же ключи, как следует:

var currencyname: NSDictionary = [ 
     "CNY": "Chinese Yuan", 
     "PLN": "Polish Zloty" 
] 

var rawrates NSDictionary = [ 
     "CNY": "1.34", 
     "PLN": "1.456" 
] 

Я пытаюсь объединить их, так что я получаю только один словарь, такие как:

 ["CNY": "Chinese Yuan","1.34"] 
     ["PLN": "Polish Zloty","1.456"] 

Я думаю, мой первый вопрос: какую переменную я должен поместить вывод? Можно ли использовать NSDictionary? Из-за того, что я читал документацию, я понял, что NSDictionaries работают по парам Key/Values. Можно ли поместить два слова в словарь?

Мой второй вопрос заключается в том, как я должен идти об объединении этих двух словарей, я попытался использовать следующий код без особого успеха

for (currency, rawrate) in rawrates { 
       for (currencyid, name) in currencyname{ 
        if currency == currencyid { 
         rawrates.append(name as String) 
        } 
       } 
} 

ответ

2

Вы можете создать словарь кортежей следующим образом:

let currencyname:[String:String] = ["CNY": "Chinese Yuan", "PLN": "Polish Zloty"] 
let rawrates:[String:String] = ["CNY": "1.34", "PLN": "1.456"] 

var combinedDictionary:[String:(name:String,rate:String)] = [:] 


for key in currencyname.keys.array { 
    combinedDictionary[key] = (currencyname[key]!,rawrates[key]!) 
} 


// Testing 

combinedDictionary["PLN"]!  // (.0 "Polish Zloty", .1 "1.456") 
combinedDictionary["PLN"]!.name // "Polish Zloty" 
combinedDictionary["PLN"]!.rate // "1.456" 

combinedDictionary["CNY"]!  // (.0 "Chinese Yuan", .1 "1.34") 
combinedDictionary["CNY"]!.name // "Chinese Yuan" 
combinedDictionary["CNY"]!.rate // "1.34" 
+1

Tuple - отличный вариант. Конечно, лучше, чем мое первое предложение массива. Используем ли мы кортеж или структуру (или класс), зависит от того, что мы намерены делать с этой информацией в долгосрочной перспективе. – nhgrif

+0

Информация предназначена только для отображения в виде таблицы (на данный момент, по крайней мере).Учитывая это, вы рекомендуете конкретный метод? – anto0522

+0

Если он будет отображаться в виде таблицы, вам просто нужно использовать массив ключей в качестве источника данных в виде таблицы. –

1

Мы не можем вполне сочетать словари таким образом. Проблема в том, что словарь допускает только одно значение для каждого ключа.

Решение вместо этого есть словарь, который выглядит примерно так:

[ 
    "CNY" : ["Chinese Yuan","1.34"], 
    "PLN" : ["Polish Zloty","1.456"] 
] 

Таким образом, наши ключи "CNY" и "PLN", но каждый ключ имеет массив значений.

Вот одна из возможных интерпретаций на совмещая словари:

var combinedDict = [String:Array<Any>]() 
for key in currencyName.allKeys { 
    combinedDict[key] = [currencyName[key], rawRates[key]] 
} 
println(combinedDict) 

Но если честно, то, что делает большинство смысла здесь является, вероятно, просто сделать что-то, чтобы держать все наши валюты информации.

struct Currency { 
    let name: String? 
    let rawRate: String? 
} 

А теперь построить словарь этих объектов:

var currencyInformation = [String:Currency]() 
for key in currencyName.allKeys { 
    combinedDict[key] = Currency(name: currencyName[key], rawRate: rawRates[key]) 
} 
+0

Спасибо за ваш ответ, я не совсем уверен, что понимаю, что именно делает «struct Currency»? он просто объявляет структуру массива? – anto0522

+0

Нет, он создает 'struct', который является типом данных. Нет короткого ответа на объяснение того, что такое '' '' '' '' ', поэтому я могу указать только на официальную документацию, чтобы прочитать. – nhgrif

+0

Спасибо за это, я прочитаю! – anto0522

0

Еще один простой ответ, используя интерполяцию строки и которая типа:

var currencyName = ["CNY":"Chinese Yuan", "PLN": "Polish Zloty"] 
var rawRates = ["CNY":"1.34" , "PLN":"1.456"] 
var combined = [String:String]() 

for (ccyCode, ccyName) in currencyName 
{ 
    if let possibleRate = rawRates[ccyCode] 
    { 
     combined[ccyCode] = "\(ccyName), \(possibleRate)" 
    } 
    else 
    { 
     combined[ccyCode] = "\(ccyName), N/A" 
    }  
} 
+0

Хм, никогда. Я неправильно понял ... Я вижу, что вы делаете сейчас. – nhgrif

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