Após os estudos das classes NSString e NSNumber, vamos aprender agora sobre um tipo de variável que nos permite armazenar diversos desses elementos em um mesmo objeto: a classe NSArray
.
Requisitos
- Conhecer o trabalho com classes e propriedades;
- Conhecer o trabalho com métodos;
- Conhecer a classe
NSString
. - Conhecer a classe
NSNumber
.
♫ Baba Yetu, de Christopher Tin ♪
Conceitos
Com base no que aprendemos até aqui, uma variável só pode armazenar um valor por vez. Isso quer dizer que, quando atribuímos um novo valor à variável, o antigo valor é descartado da memória e, dessa forma, perdido.
Quando trabalhamos com um array, a história é diferente. A proposta é permitir que uma variável possa armazenar diversos valores ao mesmo tempo. Aqueles que já estudaram programação podem conhecer termos como “matrizes”, “vetores” e “coleções”.
Partindo dessa premissa de armazenamento de múltiplos valores, nós podemos fazer uma analogia com um armário. Imagine que o array seja um armário. Dessa forma, cada gaveta pode guardar um objeto diferente. A forma de acessar esses objetos guardados é através do número da gaveta: a gaveta 3 guarda uma coisa; a gaveta 2, outra; e assim por diante. Porém, existe um conceito essencial para esse acesso. Quando programamos array, o valor da primeira “gaveta” é zero. Usando termos técnicos, o primeiro elemento armazenado em um array tem índice zero.
De maneira geral, isso é tudo o que precisamos saber antes de começar a prática. Resumindo: temos que um array é uma variável que pode guardar diversos valores, os quais são acessados através de um índice numérico que começa em zero.
Prática
Vamos começar criando um projeto chamado Classe_NSArray e definindo dois objetos NSArray
com os seguintes objetos:
Logo nesta declaração podemos notar algumas coisas importantes. A primeira delas é que mais uma vez temos uma forma antiga e uma moderna de declarar objetos. A abordagem “antiga”, usando o método arrayWithObjects, exige que no final da sequência de objetos seja usado o sentinela nil. Ele serve para definir que a sequência de objetos terminou — sua ausência resulta em alertas do Xcode.
A abordagem nova, além de enxugar a declaração, também acaba com a necessidade do uso do sentinela nil. Então mais uma vez preparem-se para, em seus estudos com livros e materiais na internet, encontrar ambas as formas de declaração.
Outro ponto que quero destacar nesse começo é sobre os tipos de dados que podemos armazenar em um array. Notem que o primeiro está guardando objetos NSString
; já o segundo está armazenando objetos NSNumber
. Conceitualmente, um NSArray
pode armazenar tipos orientados a objeto, isso quer dizer que as exclusões são os tipos primitivos de C, como int
e float
. Esse é o conceito mais importante na hora de declarar um array: só podemos guardar dados orientados a objeto.
Nota: em diversas outras situações teremos esse armazenamento de “qualquer” elemento orientado a objeto. Existe até um tipo que indica essa generalidade: id.
Uma vez que tenhamos esses dois objetos do tipo NSArray
criados, podemos usar alguns de seus métodos e propriedades.
Quando trabalhamos com coleções de elementos, é importante saber exatamente com quantos elementos estamos lidando. Para isso, temos a propriedade count, a qual retorna a quantidade de objetos que o array possui. Isso é importante para criar validações de até onde podemos ir para acessar uma lista de objetos.
Porém, mais importante do que armazenar e saber quantos itens temos é a operação de resgatar elementos. Vocês devem concordar comigo que não há nenhuma razão para guardar informações se elas não serão resgatadas, então vamos ao método que faz esse trabalho.
O método mais comum no trabalho com NSArray
é o objectAtIndex, que tem como objetivo nos retornar o que está armazenado na posição definida. Neste caso, como eu quero saber o que está guardado na primeira posição, uso o índice ZERO (lembrem-se sempre disso).
Uma vez que temos um método para resgatar um objeto de índice específico, temos uma forma de resgatar o último elemento de um array. A imagem a seguir ilustra duas formas de fazer o mesmo resgate:
Na primeira abordagem, eu criei uma variável chamada qtdeCarros para *armazenar* a *quantidade* de elementos no array carros. Eu usei o tipo de dado NSUInteger
porque ele é o tipo retornado pela propriedade count. Com base na quantidade total e tendo em mente que o acesso ao array parte de ‟0”, acessamos o último registro com a fórmula tamanho – 1.
A segunda parte do código mostra o lastObject, método específico para esse retorno. Dessa forma, ele gera toda a conta que nós fizemos na primeira parte de maneira automática. Analisando as duas formas fica claro que a segunda abordagem é mais prática e rápida.
Pensando nas situações de uso de arrays, nós podemos armazenar e resgatar valores. Ambas as ações já foram mostradas aqui, mas ainda há um recurso importante não ensinado: pesquisar elementos.
Imaginem que você está criando uma lista com nomes de meses, e essa lista não está sendo criada de maneira sequencial, mas sim conforme o usuário vai lembrando e digitando os nomes. Nesse caso, é importante saber se ele já não está contido no array antes de cadastrar um elemento.
O método containsObject retorna um valor booleano (verdadeiro ou falso) dizendo se o item em questão existe ou não na coleção. No caso da nossa lista isso é falso, já que o GT-R não consta no array carros que declaramos.
Até aqui, já temos diversos recursos para criar, resgatar e comparar valores de um objeto NSArray
— isso já deve fornecer uma boa dose de estudos e testes para vocês. No próximo artigo falarei sobre o tipo de array que pode ter mudança de conteúdo. Aí você pensa: “Mas Danilo, o NSArray
não pode ter mudança de conteúdo?!” Não, gafanhoto. Por isso o próximo texto será sobre a classe NSMutableArray
.
Novamente deixo o espaço para troca de informações e dúvidas no tópico oficial do fórum da Quaddro.
Um abraço e até a próxima!