如何在Swift中组合两个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吗?通过阅读文档,我的理解是NSDictionary是通过成对的键/值来工作的。有可能在字典里放两个值吗?

我的第二个问题是我应该如何结合这两个字典,我已经尝试使用下面的代码,但没有太大成功

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

您可以创建一个元组字典,如下所示:

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"

我们不能以这种方式完全组合字典。问题是,字典只允许每个键有一个值。

解决方案是有一个看起来像这样的字典:

[
    "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])
}

另一个简单的答案,使用字符串插值,并且类型安全:

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

最新更新