在Swift中初始化空字典数组

84

我希望您能帮助翻译有关IT技术的中文内容。将“Original Answer”翻译成中文为“最初的回答”。以下是需要翻译的内容:

我正在努力理解在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 ...>]

然而,我无法确定如何初始化一个空的字典数组。

我知道你可以有一个字典数组,因为使用初始值进行初始化是有效的:

Original Answer翻译成"最初的回答"

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

var myDictArray = [myDict1]
myDictArray += myDict2

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

然而,这种语法(你本以为是正确的)会失败:

Original Answer翻译成"最初的回答"

var myNewDictArray: Dictionary[] = []

出现错误:无法将表达式类型“Dictionary[]”转换为类型“Hashable”

因此,问题是初始化一个空的字典项数组的正确方式是什么,以及为什么这个语法 var myNewDictArray: Dictionary[] = [] 不起作用?

最初的回答:

要初始化一个空的字典项数组,请使用以下语法:var myNewDictArray: [Dictionary] = []。这是因为在Swift中,您需要指定数组中包含的元素类型。而且,您不能将不可哈希的类型(如字典)直接用作集合类型的元素类型。

6个回答

228

你需要为字典指定类型:

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
Swift在编译时使用类型推断,因此在声明变量时,您可以指定类型(如dictArray2所示),也可以立即分配可以由编译器解决的值(如dictArray3所示)。第一行比必要的更冗长,但编译器并不介意。 - Nate Cook
我不得不在Swift 2上进行更改:**var productImageArray: [Dictionary<String, String>] = [ ]**。 - swiftBoy

0
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

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

2
请添加一个解释,你的代码实际上是做什么的。以及为什么它应该解决 OP 的问题。 - jmattheis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接