Swift:声明一个空字典


177

我开始swift关注The Swift Programming LanguageApple提供的iBook- on Swift。这本书说要创建一个空字典,应该使用[:]与声明数组相同的方式[]

我声明了一个空数组,如下所示:

let emptyArr = [] // or String[]()

但是在声明空字典时,出现语法错误:

let emptyDict = [:]

如何声明空字典?


2
奇怪,我没有得到任何错误这样做,我甚至可以索要数和操场给我0
卡恩Dedeoglu

我的即使在运行时也不会给出任何编译器错误,我可以获取常量的println,而只是在控制台array :() dictionary :{}打印语句中 打印此内容 let arr = [] let dict = [:] println("array :\(arr)") println("dictionary :\(dict)")
nsuinteger 2014年


Answers:


309
var emptyDictionary = [String: String]()

­

var populatedDictionary = ["key1": "value1", "key2": "value2"]

注意:如果您要随时间更改字典的内容,则将其声明为var(变量)。您可以将一个空字典声明为let(常量),但是如果您打算随时间更改其内容,则毫无意义,因为常量在初始化后就无法更改。


旧答案

创建一个空的type字典<String, String>如下所示:

var emptyDictionary = Dictionary<String, String>()

谢谢队友,这有效。但是,如果我可以将数组声明为常量,为什么不能将字典声明为常量呢?
z22 2014年

2
当然,您无法声明const字典并将其设为空吗?AS您将永远无法为其添加价值吗?
CW0007007 2014年

1
您可以将空数组声明为常量,但没有意义。如果你读的文档,你可以看到一个数组总是声明var,我建议你:developer.apple.com/library/prerelease/ios/documentation/Swift/...
damirstuhec

1
@ Damir179第一行是完全错误的。那里没有类型信息,因此您必须是明确的,否则将产生的不可用实例__NSDictionaryI。尝试在其中添加元素,emptyDict它将在编译时失败。
加布里埃尔·彼得罗内拉2014年

1
var emptyDict:NSMutableDictionary = [:]
Jio

39

[:]除非提供类型信息,否则您将无法使用。

在这种情况下,您需要明确提供它:

var dict = Dictionary<String, String>()

var表示它是可变的,因此您可以向其中添加条目。相反,如果将其设置为a,let则无法进一步对其进行修改(let表示常量)。

[:]例如,如果可以推断类型信息,则可以使用速记符号

var dict = ["key": "value"]

// stuff

dict = [:] // ok, I'm done with it

在最后一个示例中,已知字典Dictionary<String, String>的第一行具有类型。请注意,您不必显式指定它,但是已经推断出它。


在Swift中可用的许多选项中,我最喜欢的简单String / String dict语法是:var dict: [String: String] = [:]
Dawngerpony 2014年

谢谢!。Dictionary <String,String>()解决了我的问题,实际上我有一个从Enum到MyClass的字典。“类型信息可用”是什么意思?
爱德华多·雷斯

32

斯威夫特文档建议采取以下方法来初始化一个空字典:

var emptyDict = [String: String]()

当我第一次遇到这个问题时,我有点困惑,因为不同的答案显示了初始化空字典的不同方法。事实证明,实际上有很多方法可以执行此操作,尽管考虑到Swift推断类型的能力,有些方法有些多余或过于冗长。

var emptyDict = [String: String]()
var emptyDict = Dictionary<String, String>()
var emptyDict: [String: String] = [:]
var emptyDict: [String: String] = [String: String]()
var emptyDict: [String: String] = Dictionary<String, String>()
var emptyDict: Dictionary = [String: String]()
var emptyDict: Dictionary = Dictionary<String, String>()
var emptyDict: Dictionary<String, String> = [:]
var emptyDict: Dictionary<String, String> = [String: String]()
var emptyDict: Dictionary<String, String> = Dictionary<String, String>()

空字典后,可以添加一个键-值对,如下所示:

emptyDict["some key"] = "some value"

如果要再次清空字典,可以执行以下操作:

emptyDict = [:]

这些类型仍然<String, String>是因为它是如何初始化的。


如果您想初始化一个空字典的数组,您可以这样做: var emptyDictArray = [[String: String]()] var emptyDictArray = [Dictionary<String, String>()]
Don Alejandro

19

使用它将起作用。

var emptyDict = [String: String]()

我喜欢这个。因为我们可以通过声明一个空数组var emtpyAry = [String]()。有道理。
hbin 2014年

16

您可以像这样简单地声明它:

var emptyDict:NSMutableDictionary = [:]

6

你必须给字典一个类型

// empty dict with Ints as keys and Strings as values
var namesOfIntegers = Dictionary<Int, String>()

如果编译器可以推断类型,则可以使用较短的语法

namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type Int, String


4

我也在玩这个。可以声明一个空字典然后向其添加一个键/值对,这似乎很奇怪:

var emptyDictionary = Dictionary<String, Float>()
var flexDictionary = [:]
emptyDictionary["brian"] = 4.5
flexDictionary["key"] = "value" // ERROR : cannot assign to the result of this expression

但是您可以使用“ Any”类型来创建接受不同值类型的Dictionary,如下所示:

var emptyDictionary = Dictionary<String, Any>()
emptyDictionary["brian"] = 4.5
emptyDictionary["mike"] = "hello"

4

您需要明确告诉数据类型,或者在Swift中声明任何内容时都可以推断出该数据类型。

迅捷3

下面的示例声明一个字典,其中key为Int类型,而value为String类型。

方法1:初始化程序

let dic = Dictionary<Int, String>()

方法2:速记语法

let dic = [Int:String]()

方法3:字典文字

var dic = [1: "Sample"]
// dic has NOT to be a constant
dic.removeAll()

4

斯威夫特4

let dicc = NSDictionary()

//MARK: - This is empty dictionary
let dic = ["":""]

//MARK:- This is variable dic means if you want to put variable 
let dic2 = ["":"", "":"", "":""]

//MARK:- Variable example
let dic3 = ["name":"Shakeel Ahmed", "imageurl":"https://abc?abc.abc/etc", "address":"Rawalpindi Pakistan"]

//MARK: - This is 2nd Variable Example dictionary
let dic4 = ["name": variablename, "city": variablecity, "zip": variablezip]

//MARK:- Dictionary String with Any Object
var dic5a = [String: String]()
//MARK:- Put values in dic
var dic5a = ["key1": "value", "key2":"value2", "key3":"value3"]

var dic5b = [String:AnyObject]()
dic5b = ["name": fullname, "imageurl": imgurl, "language": imgurl] as [String : AnyObject]

or
//MARK:- Dictionary String with Any Object
let dic5 = ["name": fullname, "imageurl": imgurl, "language": imgurl] as [String : AnyObject]

//MARK:- More Easy Way
let dic6a = NSDictionary()
let dic6b = NSMutalbeDictionary()

3

如果要创建任何类型的通用词典

var dictionaryData = [AnyHashable:Any]()

谢谢,最后因为这是需要添加字典类型后不只是字符串
米切尔柯里

3

我通常在使用

var dictionary:[String:String] = [:]
dictionary.removeAll()

3

在Swift中声明和初始化字典

字符串字典

var stringDict: [String: String] = [String: String]()

要么

var stringDict: Dictionary<String, String> = Dictionary<String, String>()

国际词典

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

要么

var stringDict: Dictionary<String, Int> = Dictionary<String, Int>()

AnyObject字典

var stringDict: [String: AnyObject] = [String: AnyObject]()

要么

var stringDict: Dictionary<String, AnyObject> = Dictionary<String, AnyObject>()

字符串数组字典

var stringDict: [String: [String]] = [String: [String]]()

要么

var stringDict: Dictionary<String, Array<String>> = Dictionary<String, Array<String>>()

字符串字典数组

var stringDict: [[String: String]] = [[String: String]]()

要么

var stringDict: Array<Dictionary<String, String>> = Array<Dictionary<String, String>>()

0

您可以使用以下命令将其声明为nil:

var assoc : [String:String]

那就好了,您已经进行了排版(请注意,我使用var而不是让它们视为可变且不可变的)。然后您可以稍后填写:

assoc = ["key1" : "things", "key2" : "stuff"]

0

您可以使用以下代码:

var d1 = Dictionary<Int, Int>()
var d2 = [Int: Int]()
var d3: Dictionary<Int, Int> = [Int : Int]()
var d4: [Int : Int] = [:]

-1

var dictList = String:迅捷中字典的字符串var arrSectionTitle =迅捷中数组的字符串



-2
var parking = [Dictionary < String, Double >()]

^这会为[string:double]输入添加字典

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.