Ios 使用Swift在NSArray中匹配NSDictionary的模式

Ios 使用Swift在NSArray中匹配NSDictionary的模式,ios,macos,swift,Ios,Macos,Swift,我在操场上有这个密码 import UIKit let anArray = NSArray(array:[["code": "LT","name": "Lithuania"], ["code": "ME","name": "Montenegro"], ["code": "ES","name": "Spain"]]) let findCode = "ES" for object in anArray { if (object["code"] as String == findCode

我在操场上有这个密码

import UIKit

let anArray = NSArray(array:[["code": "LT","name": "Lithuania"], ["code": "ME","name": "Montenegro"], ["code": "ES","name": "Spain"]])

let findCode = "ES"

for object in anArray {
    if (object["code"] as String == findCode) {
        object["name"] as String
    }
}

我想通过模式匹配以某种方式简化它,这可能吗?

我在一个操场上创建了这个

import UIKit

let array : [[String: String]] = [["code": "LT","name": "Lithuania"], ["code": "ME","name": "Montenegro"], ["code": "ES","name": "Spain"]]

let findCode = "ES"

let filteredArray = array.filter{$0["code"] == findCode}

println(filteredArray) // [["code": "ES", "name": "Spain"]]
它使用过滤函数而不是迭代

FilterDarray将是一个对象数组,其中对象[代码]==findCode

编辑-如果您知道只有一个

你可以做得更进一步

...
let country = array.filter{$0["code"] == findCode}.first?["name"] // updated, thanks @MikeS

if let unwrappedCountry = country {
    println(unwrappedCountry) // "Spain"
}

我在操场上创造了这个

import UIKit

let array : [[String: String]] = [["code": "LT","name": "Lithuania"], ["code": "ME","name": "Montenegro"], ["code": "ES","name": "Spain"]]

let findCode = "ES"

let filteredArray = array.filter{$0["code"] == findCode}

println(filteredArray) // [["code": "ES", "name": "Spain"]]
它使用过滤函数而不是迭代

FilterDarray将是一个对象数组,其中对象[代码]==findCode

编辑-如果您知道只有一个

你可以做得更进一步

...
let country = array.filter{$0["code"] == findCode}.first?["name"] // updated, thanks @MikeS

if let unwrappedCountry = country {
    println(unwrappedCountry) // "Spain"
}
您可以从外部去掉NSArray,将字典数组折叠到一个字典,该字典将代码映射到名称,并在其中快速查找,如下所示:

let aDict = [
    ["code": "LT","name": "Lithuania"]
,   ["code": "ME","name": "Montenegro"]
,   ["code": "ES","name": "Spain"]
]
let dict = aDict.reduce(Dictionary<String,String>()) {
    (var dict, e) in
    dict[e["code"]!] = e["name"]!
    return dict
}
print(dict["ES"]!)
您可以从外部去掉NSArray,将字典数组折叠到一个字典,该字典将代码映射到名称,并在其中快速查找,如下所示:

let aDict = [
    ["code": "LT","name": "Lithuania"]
,   ["code": "ME","name": "Montenegro"]
,   ["code": "ES","name": "Spain"]
]
let dict = aDict.reduce(Dictionary<String,String>()) {
    (var dict, e) in
    dict[e["code"]!] = e["name"]!
    return dict
}
print(dict["ES"]!)

它在干什么?正在尝试筛选数组吗?在字典数组中查找特定代码的名称。我想是的。好的,我只是想看看。我添加了一个答案。它在做什么?正在尝试筛选数组吗?在字典数组中查找特定代码的名称。我想是的。好的,我只是想看看。我添加了一个答案。使用过滤器捕捉到的效果很好@扎夫:谢谢。我对斯威夫特还是个新手,但它的功能太强大了。@Fogmeister,使用它会更安全。首先,而不是[0]。first返回一个包含数组中第一个元素的可选值,如果数组为空,则返回nil。然后,您可以在一个镜头中进行筛选、索引和解包:如果让LaGaGeNAME=数组。筛选器{ $ 0 [代码]=FIDCODE}}。首先,[NOT] {…}注:Objul-C基金会也有一个数组过滤方法:-WoIDFILTERUSEIN谓词:NSPReDATE*谓词。@ FoMeistor,那将是一个耻辱,然后,模式匹配很好。使用过滤器捕捉到的效果很好@扎夫:谢谢。我对斯威夫特还是个新手,但它的功能太强大了。@Fogmeister,使用它会更安全。首先,而不是[0]。first返回一个包含数组中第一个元素的可选值,如果数组为空,则返回nil。然后,您可以在一个镜头中进行过滤、索引和解包:如果让LaGaGeNAME=数组。筛选器{ $ 0 [代码]=FIDCODE}}。首先,[OND] {…}注:ObjuleC基金会也有一个数组过滤方法:-WoIDFieldUsIdEngult:NSPReDiga*谓词。@ FoMeistor,这将是一个耻辱,那么模式匹配是很漂亮的。我曾想过使用reduce,但我对它的工作原理知之甚少。啊,我曾想过使用reduce,但对它的工作原理知之甚少。