Swift

Swift2の配列、辞書の初期化

More than 3 years have passed since last update.

Swift1.2で通用した初期化方法が通用しない!!


foo.swift

//以下はコンパイルエラー発生

//var e: Dictionary[String: Int]
//var e: Dictionary<String: Int>
//var e: Dictionary
var e: [String: Int]
var d: [String: Int] = ["OK": 1, "NG": 0]
print(d) // =>[OK: 1, NG: 0]
var a: [[String: Int]] = [["OK": 1], ["NG": 0]]
func foo(inout a: [[String: Int]]) {
a[0] = ["why": 2]
}
foo(&a)
print(a) // =>[[why: 2], [NG: 0]]

func bar(var a: [[String: Int]]) {
a[0] = ["How":3]
print(a)
}
bar(a) // =>[[How: 3], [NG: 0]]


その代りメソッドの引数にvar修飾した変数を記載しておくと、メソッド呼び出し時に&修飾が不要になるみたい。


  • どうやらArrayやDictionaryはOpen Source化への布石であって、iOS, OSX用アプリ作るんだったら、NSMutableArray, NSMutableDictionaryを使えって事じゃないのかなぁ。あと、高速動作を望むなら、使えるときにはNSArray, NSDictionaryとか。

  • NSMutableArray, NSMutableDictionaryの方が宣言の記述が簡単だ。辞書を格納した配列なんか、[[String: Int]]なんて複雑なこと書かなくても、ただ単にNSMutableArrayって書けばコンパイルが通ってくれる。


foo.swift

import Foundation

var d: NSMutableDictionary = ["OK": 1, "NG": 0]
print(d)
var a: NSMutableArray = [["OK": 1], ["NG": 0]]
func foo(a: NSMutableArray) {
a[0] = ["Why": 2]
}
foo(a)
print(a)
a.addObject(["Which": 99])
print(a)

func bar(d: NSMutableDictionary) {
d.setObject(3, forKey:"How") // add element.
print(d)
}
bar(d)

d.setObject(7, forKey: "OK") // modify element.
print(d)
//{
// NG = 0;
// OK = 1;
//}
//(
// {
// Why = 2;
// },
// {
// NG = 0;
// }
//)
//(
// {
// Why = 2;
// },
// {
// NG = 0;
// },
// {
// Which = 99;
// }
//)
//{
// How = 3;
// NG = 0;
// OK = 1;
//}
//{
// How = 3;
// NG = 0;
// OK = 7;
//}