在Swift中初始化字典的空数组


80

我试图把头放在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 ...>]

但是,我无法计算出初始化空数组Dictionary的语法。

我知道您可以拥有一系列的Dictionary,因为使用初始值进行初始化是可行的:

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[] = []不起作用?

Answers:


215

您需要为字典指定类型:

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?>


您的示例不是关于字典的不变性,而是关于变量的不变性。
Samy Dindane

6

这不起作用的原因:

var myNewDictArray: Dictionary[] = []

是您在定义字典时需要提供字典的键和值的类型。这些行中的每一行都会为您创建一个包含字符串键和字符串值的空字典数组:

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

1
是的,这可行。知道为什么有两种方法吗?
dwkns 2014年

Swift在编译时使用类型推断,因此在声明变量时,您既可以指定类型(像dictArray2这样),也可以立即给它分配编译器可以弄清楚的东西(像dictArray3那样)。第一行比必要的更为冗长,但是编译器并不介意。
Nate Cook

我必须在Swift 2 var productImageArray
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.