web-dev-qa-db-ja.com

Swiftでの辞書の空の配列の初期化

私は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[] = []が機能しないのか?

72
dwkns

辞書に型を与える必要があります:

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

または

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

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

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

または

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

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

let dictionary = [ : ]

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

var dictionary = [ : ]

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

9
Erik

これが機能しない理由:

var myNewDictArray: Dictionary[] = []

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

var dictArray1: Dictionary<String, String>[] = Dictionary<String, String>[]()
var dictArray2: Dictionary<String, String>[] = []
var dictArray3 = Dictionary<String, String>[]()
6
Nate Cook
var yourArrayname = [String]() // String or anyOther according to need
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
0
CPD