Swiftで辞書の空の配列を初期化する


82

Swiftで空の配列を初期化することに頭を悩ませようとしています。

文字列の配列の場合、それは非常に簡単です:

var myStringArray: String[] = []
myStringArray += "a"
myStringArray += "b"

-> ["a", "b"]

および整数の場合

var myIntArray: Int[] = []
myIntArray += 1
myIntArray += 2

-> [1, 2]

NSImageオブジェクトなどの他のタイプのオブジェクトでも機能します。

let path = "/Library/Application Support/Apple/iChat Icons/Flags/"
let image1 = NSImage(byReferencingFile: path + "Brazil.png")
let image2 = NSImage(byReferencingFile: path + "Chile.png")

var myImageArray: NSImage[] = []
myImageArray += image1
myImageArray += image2

-> [<NSImage 0x7fe371c199f0 ...>, <NSImage 0x7fe371f39ea0 ...>]

ただし、辞書の空の配列を初期化するための構文を理解することはできません。

初期値での初期化が機能するため、辞書の配列を持つことができることを私は知っています:

let myDict1 = ["someKey":"someValue"]
let myDict2 = ["anotherKey":"anotherValue"]

var myDictArray = [myDict1]
myDictArray += myDict2

-> [["someKey": "someValue"], ["anotherKey": "anotherValue"]]

ただし、これは(構文がそうであると予想される)失敗します:

var myNewDictArray: Dictionary[] = []

エラーで Cannot convert the expression's type 'Dictionary[]' to type 'Hashable'

だから問題は、辞書アイテムの空の配列を初期化する正しい方法は何var myNewDictArray: Dictionary[] = []ですか、そしてなぜこの構文が機能しないのですか?

回答:


219

辞書にタイプを指定する必要があります。

var myNewDictArray: [Dictionary<String, Int>] = []

または

var myNewDictArray = [Dictionary<String, Int>]()

編集:短い構文を使用することもできます:

var myNewDictArray: [[String:Int]] = []

または

var myNewDictArray = [[String:Int]]()

9

これにより、空の不変の辞書が作成されます。

let dictionary = [ : ]

そして、変更可能なものが必要な場合:

var dictionary = [ : ]

これらの辞書は両方ともデフォルトでDictionary<String?, AnyObject?>


あなたの例は、辞書の不変性についてではなく、変数の不変性についてです。
サミーディンダン2015

6

これが機能しない理由:

var myNewDictArray: Dictionary[] = []

辞書を定義するときに、辞書のキーと値の型を指定する必要があるということです。これらの各行は、文字列キーと文字列値を持つ辞書の空の配列を作成します。

var dictArray1: Dictionary<String, String>[] = Dictionary<String, String>[]()
var dictArray2: Dictionary<String, String>[] = []
var dictArray3 = Dictionary<String, String>[]()

1
はい、これは機能します。それを行う2つの方法がある理由は何ですか?
dwkns 2014年

Swiftはコンパイル時に型推論を使用するため、変数を宣言するときに、型を指定するか(dictArray2doesのように)、コンパイラーが理解できるものをすぐに割り当てることができます(dictArray3doesのように)。最初の行は必要以上に冗長ですが、コンパイラーはそれを気にしません。
ネイトクック2014年

Swift2で
swiftBoy 2016

0

要素の連結は使用できなくなりました。

class Image {}
Image i1
Image i2

var x = [Image]()

x += i1 // will not work (adding an element is ambiguous)
x += [i1] // this will work (concatenate an array to an array with the same elements)

x += [i1, i2] // also good


-1

swift 2.3を使いたいなら、これを使うことができます!

let path = "/Library/Application Support/Apple/iChat Icons/Flags/"
let image1 = UIImage(contentsOfFile: readPath + "Brazil.png")
let image2 = UIImage(contentsOfFile: readPath + "Chile.png")

var myImageArray = [UIImage]()
myImageArray.append(image1)
myImageArray.append(image2)

1
コードが実際に何をするのか、説明を追加してください。そして、なぜそれがopの問題を修正する必要があるのか​​。
jmattheis 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.