Como adicionar a um NSDictionary


91

Eu estava usando um NSMutableArraye percebi que usar um dicionário é muito mais simples para o que estou tentando alcançar.

Quero salvar uma chave como um NSStringe um valor como um intno dicionário. Como isso é feito? Em segundo lugar, qual é a diferença entre mutável e um dicionário normal?

Respostas:


197

Um dicionário mutável pode ser alterado, ou seja, você pode adicionar e remover objetos. Um imutável é fixo depois de criado.

criar e adicionar:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

e recuperar:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

Você tem que iniciar com uma capacidade ou pode ser apenas dinâmico?
muttley91 de

2
Você não precisa especificar a capacidade inicial, mas poderá ver ganhos de desempenho se o fizer. Se você souber antecipadamente quantos itens ele conterá, forneça este número ou um valor um pouco maior.
Eiko

pedindo NSDictionary, não NSMutableDictionary?
Ananta Prasad

34

Ao definir, você usaria o setValue:(id)value forKey:(id)keymétodo do NSMutableDictionaryobjeto:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

Ou no moderno Objective-C:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

A diferença entre mutável e "normal" é, bem, mutabilidade. Ou seja, você pode alterar o conteúdo de NSMutableDictionary(e NSMutableArray) enquanto não pode fazer isso com "normal" NSDictionaryeNSArray


2
Você não deveria envolver esse inteiro em um NSNumber?
Johan Kool

Eu tenho mais um problema com isso. Preciso armazenar um texto inserido pelo usuário como string, bem como a referência da imagem (o índice na matriz de imagens) em que o usuário está salvando o texto. Eu tentei um mutableArray de objetos que têm 2 variáveis, uma para cada que acabei de mencionar. que não estava funcionando bem ao tentar preencher o tableView com os valores de texto dos objetos de matriz. Então pensei em um dicionário, o único problema é que não parece que eu poderia recuperar dados por índice, tem que ser uma chave ou valor como um hashmap certo?
sistema

@Johan - correto e atualizado! @alJaree - sim, o dicionário é uma espécie de armazenamento de valores-chave. Acho que, na sua posição, você seria melhor com uma variedade de dicionários. Algo como[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas

Isso ainda não funcionará para mim, porque preciso recuperar o texto de cada objeto e usá-lo para preencher os favoritos UITableView, bem como preciso de uma referência de índice para a matriz de imagem para que eu possa recuperar e exibir a imagem favorita selecionada. Eu tentei o objeto que descrevi acima, mas os objetos retornaram ao ler o array onde NSStrings por algum motivo, em vez do objeto específico que foi armazenado. Não tenho certeza do que fazer aqui,
sistema

Estou pensando que talvez precise apenas armazenar NSStrings como @ "% d _% @, index, savedTitle e, em seguida, apenas dividir o NSString e pegar e dipay o que preciso. Estou pensando em termos de java, com certeza deve haver um função de divisão em obj c. :)
sistema

16

Sempre que a matriz é declarada, então só temos que adicionar os valores-chave em NSDictionary como

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

não podemos adicionar ou remover os valores-chave neste NSDictionary

Onde, como em NSMutableDictionary, podemos adicionar os objetos após a inicialização do array também usando este método

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

para remover o valor-chave, temos que usar o seguinte código

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

Versão atualizada

Objective-C

Crio:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

Mudança:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

A sintaxe abreviada é chamada Objective-C Literals.

Rápido

Crio:

var dictionary = ["myKey1": 7, "myKey2": 5]

Mudança:

dictionary["myKey3"] = 3

1

Você quer perguntar é "qual é a diferença entre uma matriz ou dicionário mutável e não mutável." Muitas vezes, diferentes termos são usados ​​para descrever coisas que você já conhece. Nesse caso, você pode substituir o termo "mutável" por "dinâmico". Assim, um dicionário ou matriz mutável é aquele que é "dinâmico" e pode mudar em tempo de execução, enquanto um dicionário ou matriz não mutável é aquele que é "estático" e definido em seu código e não muda em tempo de execução (em outras palavras , você não irá adicionar, excluir ou possivelmente classificar os elementos.)

Sobre como isso é feito, você está nos pedindo para repetir a documentação aqui. Tudo que você precisa fazer é pesquisar no código de amostra e na documentação do Xcode para ver exatamente como isso é feito. Mas a coisa mutável também me abalou quando eu estava aprendendo pela primeira vez, então vou te dar essa!


Às vezes não há uma explicação decente o suficiente sobre os documentos do Xcode, ele se aprofunda na teoria sem exemplos claros, nem sempre, mas às vezes. : P Sim, eu entendo a parte mutável (capaz de sofrer mutação) agora, obrigado. :)
sistema

0

Para referência, você também pode utilizar initWithDictionarypara iniciar o NSMutableDictionarycom um literal:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.