Swift: declarar um dicionário vazio

178

Estou começando a aprender swiftseguindo o iBook- The Swift Programming Languageon Swift fornecido pela Apple. O livro diz que, para criar um dicionário vazio, deve-se usar o [:]mesmo que ao declarar o array como[] :

Eu declarei uma matriz vazia da seguinte maneira:

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

Mas ao declarar um dicionário vazio, recebo um erro de sintaxe:

let emptyDict = [:]

Como declaro um dicionário vazio?

z22
fonte
2
estranho, não recebo erro ao fazer isso, posso até pedir a contagem e o playground me dá 0. #
Kaan Dedeoglu 4/14
meu does not dar qualquer erro do compilador mesmo de tempo de execução posso obter um println das constantes e eles simplesmente imprimir esta no console de array :() dictionary :{}instruções de impressão let arr = [] let dict = [:] println("array :\(arr)") println("dictionary :\(dict)")
NSUInteger
Verifique este link
Juan Boero 30/03

Respostas:

310
var emptyDictionary = [String: String]()

­

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

Nota : se você quiser alterar o conteúdo do dicionário ao longo do tempo, declare-o como uma var(variável). Você pode declarar um dicionário vazio como let(constante), mas não faz sentido se você tiver a intenção de alterar seu conteúdo ao longo do tempo, pois a constante não poderá ser alterada após a inicialização.


Resposta antiga :

A criação de um dicionário do tipo vazio <String, String>teria a seguinte aparência:

var emptyDictionary = Dictionary<String, String>()
damirstuhec
fonte
Obrigado companheiro, isso funciona. Mas por que não posso declarar o dicionário como constante se posso declarar uma matriz como constante?
z22 4/04
2
Certamente você não poderia declarar um dicionário const e torná-lo vazio? Como você nunca seria capaz de adicionar valores a ele?
CW0007007
1
Você pode declarar a matriz vazia como uma constante, mas não faz sentido. Se você ler os docs, você pode ver que uma matriz é sempre declarado como varcomo sugeri-lhe: developer.apple.com/library/prerelease/ios/documentation/Swift/...
damirstuhec
1
@ Damir179 a primeira linha está completamente errada. Não há informações de tipo lá, então você precisa ser explícito, caso contrário, você produzirá uma instância inutilizável de __NSDictionaryI. Tente adicionar um elemento a emptyDictele e ele falhará no momento da compilação.
Gabriele Petronella
1
var emptyDict: NSMutableDictionary = [:]
Jio
39

Você não pode usar [:] menos que as informações de tipo estejam disponíveis.

Você precisa fornecê-lo explicitamente neste caso:

var dict = Dictionary<String, String>()

varsignifica que é mutável, para que você possa adicionar entradas a ele. Por outro lado, se você o fizer, letnão poderá mais modificá-lo (let significa constante).

Você pode usar a [:]notação abreviada se as informações de tipo puderem ser deduzidas, por exemplo

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

// stuff

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

No último exemplo, sabe-se que o dicionário possui um tipo Dictionary<String, String>pela primeira linha. Observe que você não precisou especificá-lo explicitamente, mas foi inferido.

Gabriele Petronella
fonte
Das muitas opções disponíveis no Swift, a minha sintaxe favorito para um simples Cordas / String dict é:var dict: [String: String] = [:]
Dawngerpony
Obrigado!. O dicionário <String, String> () resolveu meu problema, na verdade eu tinha um dicionário do Enum para o MyClass. O que você quer dizer com "informações de tipo estão disponíveis"?
Eduardo Reis
32

A documentação do Swift recomenda a seguinte maneira de inicializar um dicionário vazio:

var emptyDict = [String: String]()

Fiquei um pouco confuso quando me deparei com essa pergunta, porque respostas diferentes mostraram maneiras diferentes de inicializar um dicionário vazio. Acontece que existem muitas maneiras de fazer isso, embora algumas sejam um pouco redundantes ou excessivamente detalhadas, dada a capacidade de Swift de inferir o tipo.

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

Depois de ter um dicionário vazio, você pode adicionar um par de valores-chave como este:

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

Se você quiser esvaziar seu dicionário novamente, faça o seguinte:

emptyDict = [:]

Os tipos ainda são <String, String>porque foi assim que foi inicializado.

Suragch
fonte
Se você deseja inicializar uma matriz de um dicionário vazio, faça o seguinte: var emptyDictArray = [[String: String]()] var emptyDictArray = [Dictionary<String, String>()]
Don Alejandro
19

Use isso vai funcionar.

var emptyDict = [String: String]()
Lim Thye Chean
fonte
Eu prefiro este. Porque podemos declarar uma matriz vazia por var emtpyAry = [String](). Isso faz sentido.
Hb20
16

Você pode simplesmente declarar assim:

var emptyDict:NSMutableDictionary = [:]
Jio
fonte
6

Você precisa atribuir um tipo ao dicionário

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

Se o compilador puder inferir o tipo, você poderá usar a sintaxe mais curta

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

Rápido:

var myDictionary = Dictionary<String, AnyObject>()
Juan Boero
fonte
4

Também estou brincando com isso. Parece estranho que você possa simplesmente declarar um dicionário vazio e adicionar um par de chave / valor a ele da seguinte maneira:

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

Mas você pode criar um Dicionário que aceite diferentes tipos de valor usando o tipo "Qualquer", da seguinte forma:

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

Você precisa informar explicitamente o tipo de dados ou o tipo pode ser inferido quando você declara algo no Swift.

Swift 3

A amostra abaixo declara um dicionário com chave como um Inttipo e o valor como umString tipo.

Método 1: Inicializador

let dic = Dictionary<Int, String>()

Método 2: sintaxe abreviada

let dic = [Int:String]()

Método 3: dicionário literal

var dic = [1: "Sample"]
// dic has NOT to be a constant
dic.removeAll()
Lorem Ipsum Dolor
fonte
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()
Shakeel Ahmed
fonte
3

Se você deseja criar um dicionário genérico com qualquer tipo

var dictionaryData = [AnyHashable:Any]()
reetu
fonte
Obrigado, finalmente, porque isso é necessário para adicionar um tipo de dicionário mais tarde não apenas corda
Mitchell Currie
3

Eu normalmente estou usando

var dictionary:[String:String] = [:]
dictionary.removeAll()
Lind el Loren
fonte
3

Declarando e inicializando dicionários no Swift

Dicionário de Cordas

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

OU

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

Dicionário Int

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

OU

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

Dicionário de AnyObject

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

OU

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

Dicionário de Array of String

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

OU

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

Matriz de dicionários de string

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

OU

var stringDict: Array<Dictionary<String, String>> = Array<Dictionary<String, String>>()
Syed Qamar Abbas
fonte
0

Você pode declarar como nulo com o seguinte:

var assoc : [String:String]

Então o mais legal é que você já escreveu (observe que usei var e não deixei, pense neles como mutável e imutável). Então você pode preenchê-lo mais tarde:

assoc = ["key1" : "things", "key2" : "stuff"]
noticiários
fonte
0

Você pode usar o seguinte código:

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

var dictList = String: String para dicionário em swift var arrSectionTitle = String para array em swift

Gaurav
fonte
-2

É muito útil para encontrar o seu caminho

dicionário de var: Dictionary = [:]

Uttam Kumar
fonte
Você também deve usar os tipos de chave e valor.
Suragch
-2
var parking = [Dictionary < String, Double >()]

^ isso adiciona um dicionário para uma entrada [string: double]

wildCard
fonte