Quaddro + MacMagazine: programando em Objective-C — classe NSArray

Declaração Array

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

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:

Declaração Array

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.

Propriedade Count

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.

Método ObjectAtIndex

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:

Último elemento

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.

ContaisObject

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!

Posts relacionados