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.