Swift: объявить пустой словарь

178

Я начинаю учиться swift, следуя iBook The Swift Programming Languageon Swift, предоставленной Apple. В книге сказано, что для создания пустого словаря следует использовать то [:]же, что и при объявлении массива []:

Я объявил пустой массив следующим образом:

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

Но при объявлении пустого словаря я получаю синтаксическую ошибку:

let emptyDict = [:]

Как мне объявить пустой словарь?

z22
источник
2
странно, я не ошибаюсь при этом, я даже могу попросить подсчет, и игровая площадка дает мне 0.
Каан Дедеоглу
Мой не дает никакой ошибки компилятора, даже во время выполнения, я могу получить println констант, и они просто печатают это в array :() dictionary :{}операторах печати консоли let arr = [] let dict = [:] println("array :\(arr)") println("dictionary :\(dict)")
nsuinteger

Ответы:

310
var emptyDictionary = [String: String]()

­

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

Примечание : если вы собираетесь со временем изменять содержимое словаря, объявите его как var(переменную). Вы можете объявить пустой словарь как let(константу), но это бессмысленно, если у вас есть намерение изменять его содержимое с течением времени, поскольку константа не может быть изменена после ее инициализации.


Старый ответ :

Создание пустого словаря типа <String, String>будет выглядеть следующим образом:

var emptyDictionary = Dictionary<String, String>()
damirstuhec
источник
Спасибо друг, это работает. Но почему я не могу объявить словарь как константу, если я могу объявить массив как константу?
z22
2
Конечно, вы не можете объявить постоянный словарь и сделать его пустым? КАК вы никогда не сможете добавить к нему ценностей?
CW0007007
1
Вы можете объявить пустой массив как константу, но это бессмысленно. Если вы прочитаете документы, вы увидите, что массив всегда объявляется так, varкак я вам предлагал: developer.apple.com/library/prerelease/ios/documentation/Swift/…
damirstuhec
1
@ Damir179 первая строка просто неверна. Там нет информации о типе, поэтому вы должны быть явными, иначе вы получите непригодный экземпляр __NSDictionaryI. Попробуйте добавить элемент к этому, emptyDictи он не удастся во время компиляции.
Габриэле Петронелла
1
var emptyDict: NSMutableDictionary = [:]
Джио
39

Вы не можете использовать [:] если информация о типе не доступна.

Вы должны предоставить это явно в этом случае:

var dict = Dictionary<String, String>()

varозначает, что он изменчив, поэтому вы можете добавлять в него записи. И наоборот, если вы сделаете это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
Спасибо!. Словарь <String, String> () исправил мою проблему, у меня фактически был словарь от Enum до MyClass. Что вы подразумеваете под «информация о типе доступна»?
Эдуардо Рейс
32

Документация Swift рекомендует следующий способ инициализации пустого словаря:

var emptyDict = [String: String]()

Я был немного смущен, когда впервые столкнулся с этим вопросом, потому что разные ответы показали разные способы инициализации пустого словаря. Оказывается, на самом деле есть много способов сделать это, хотя некоторые из них немного избыточны или слишком многословны, учитывая способность Свифта выводить тип.

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>потому что так было инициализировано.

Suragch
источник
Если бы вы хотели инициализировать массив пустого словаря, вы бы сделали это так: var emptyDictArray = [[String: String]()] var emptyDictArray = [Dictionary<String, String>()]
Дон Алехандро
19

Используйте это будет работать.

var emptyDict = [String: String]()
Лим Тай Тай
источник
Я предпочитаю этот. Потому что мы можем объявить пустой массив с помощью var emtpyAry = [String](). Это имеет смысл.
hbin
16

Вы можете просто объявить это так:

var emptyDict:NSMutableDictionary = [:]
Jio
источник
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
Неван Кинг
источник
5

Swift:

var myDictionary = Dictionary<String, AnyObject>()
Хуан Боэро
источник
4

Я тоже играю с этим. Кажется странным, что вы можете просто объявить пустой словарь, а затем добавить к нему пару ключ / значение следующим образом:

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

Но вы можете создать словарь, который принимает различные типы значений, используя тип «Любой», например:

var emptyDictionary = Dictionary<String, Any>()
emptyDictionary["brian"] = 4.5
emptyDictionary["mike"] = "hello"
Ли Проберт
источник
4

Вам необходимо явно указать тип данных, или тип может быть выведен при объявлении чего-либо в Swift.

Swift 3

Пример ниже объявляет словарь с ключом в качестве Intтипа и значением как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

Swift 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]()
reetu
источник
Спасибо, наконец, потому что это необходимо, чтобы позже добавить тип словаря, а не просто строку
Mitchell Currie,
3

Я обычно использую

var dictionary:[String:String] = [:]
dictionary.removeAll()
Линд эль Лорен
источник
3

Объявление и инициализация словарей в Swift

Словарь строки

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

ИЛИ

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

Словарь Int

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

Вы можете объявить это как ноль со следующим:

var assoc : [String:String]

Хорошо, что вы уже набрали текст (обратите внимание, что я использовал var, а не let, думайте о них как о изменяемых и неизменных). Тогда вы можете заполнить его позже:

assoc = ["key1" : "things", "key2" : "stuff"]
newshorts
источник
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: строка для словаря в swift var arrSectionTitle = строка для массива в swift

Gaurav
источник
-2

Это очень удобно, чтобы найти свой путь

var dict: Dictionary = [:]

Уттам Кумар
источник
Вы также должны использовать типы ключей и значений.
Сурагч
-2
var parking = [Dictionary < String, Double >()]

^ это добавляет словарь для ввода [string: double]

WildCard
источник