19499


質問：配列の中に格納した辞書から効率的にデータを取り出す方法を教えてください。

下記のように様々な型のデータが入った辞書が１０個程度あり、それらを配列として格納したtestArrayがあります。

[code]

    let webview0 = UIWindow()
    let webview1 = UIWindow()
    let webview2 = UIWindow()
    
    let dic0 = ["name": "yuichi", "string": "test1", "number": 2, "web": webview0]
    let dic1 = ["name": "kato", "string": "test2", "number": 5, "web": webview1]
    let dic2 = ["name": "max", "string": "test3", "number": 8, "web": webview2]
    
    let testArray = [dic0, dic1, dic2]
    
[/code]

ここからからnameだけ取り出したい場合、現状は下記のようにループで回して値を取得しているのですが、何か回りくどい気がしています。もっと良いやり方があれば教えていただけないでしょうか。

[code]

    var newArray = [AnyObject]()
    for(var i=0; i<testArray.count; i++) {
        let string: String = testArray[i]["name"] as! String
        newArray.append(string)
    }
    
[/code]

（Realmなどモバイル向けデータベースを使えば扱いやすくなるのだと思いますが、１０個程度しかデータがないので、ちょっとオーバースペックかなと）


CC BY-SA 3.0
2015-12-01T03:37:48.423
19494
2015-12-01T08:57:09.667
2015-12-01T03:56:34.000
682
682
question
ios swift
Swiftで配列の中に入れた辞書データの効率的な取り出し方


`map()`が登場するときがやってきました。以下のコードを、Playgroundで実行してみてください。

[code]

    import UIKit
    
    let webview0 = UIWindow()
    let webview1 = UIWindow()
    let webview2 = UIWindow()
    
    let dic0: [String: AnyObject] = ["name": "yuichi", "string": "test1", "number": 2, "web": webview0]
    let dic1: [String: AnyObject] = ["name": "kato", "string": "test2", "number": 5, "web": webview1]
    let dic2: [String: AnyObject] = ["name": "max", "string": "test3", "number": 8, "web": webview2]
    
    let testArray = [dic0, dic1, dic2]
    
    let nameArray = testArray.map{$0["name"] as! String}
    
    nameArray // ["yuichi", "kato", "max"]
    
[/code]

`let nameArray = testArray.map{$0["name"] as! String}`

は省略形で、より省略していない形に戻すと、

[code]

    let nameArray: [String] = testArray.map({dic: [String: AnyObject] -> String in
        return dic["name"] as! String
    })
    
[/code]

となります。  
Arrayのメソッド`map()`は、配列のメンバーひとつひとつに対して、クロージャに定義した処理を行い、返り値を新規の配列のメンバーにするという作業をします。  
Arrayには、ほかに`reduce()`、`filter()`などの便利なメソッドが用意されているので、一度お調べになるといいですよ。


CC BY-SA 3.0
2015-12-01T05:38:46.507
19499
2015-12-01T08:57:09.667
2015-12-01T08:57:09.667
7362
7362
19494
answer