lugar, porém nós queremos manter uma relação de todos os registros que foram in-
seridos e mostrar no console a relação completa a cada nova empresa. Existe uma
infinidade de maneiras de realizar esta tarefa, e para o propósito deste capítulo
que é apresentar em maiores detalhes o Xcode e a linguagem Objective-C vamos
nos concentrar em algo simples e prático, como uma lista em memória, utilizando a
classe NSArray.
NSArray versus array
Apesar de conter a palavra array no nome, tecnicamente a classe
NSArray não é um array no conceito formal da linguagem,
mas sim se
equivale muito mais a uma lista, algo como a classe ArrayList de Java
e C#.
41
3.13. Guardando todas empresas em memória
Casa do Código
A primeira coisa a fazer é ir para o arquivo ViewController.h (tecla de ata-
lho CTRL + Command + Seta para cima) e declarar uma variável chamada
catalogo do tipo NSMutableArray, conforme exemplificado abaixo:
1 # import <UIKit / UIKit.h>
2
3 @interface ViewController : UIViewController { // Abre chave aqui
4
NSMutableArray *catalogo;
5 } // Fecha chave aqui
6
7 // Este código abaixo já havia sido feito anteriormente
8 @property (weak, nonatomic) IBOutlet UITextField *nomeField;
9 @property (weak, nonatomic) IBOutlet UITextField *quantidadeField;
10 @property (weak, nonatomic) IBOutlet UILabel *avisoSucessoLabel;
11 - (IBAction)incrementadorAlterado:(id)sender;
12 - (IBAction)salvar:(id)sender;
13
14 @end
O código referente a esta seção é o da linha 4, lembrando que é necessário
adicioná-lo entre chaves (final da linha 3 e linha 5), como foi explicado anterior-
mente na seção da classe Empresa. Da linha 8 em diante é o código que criamos
anteriormente, e foi adicionado na listagem apenas para referência.
Voltando o arquivo ViewController.m (lembra da tecla de atalho?), vamos
criar o método para armazenar as empresas no objeto catalogo, e depois chamar o
método na ação do botão Salvar. Adicione o seguinte código logo antes do método
- (IBAction)salvar:(id)sender:
1 -(void) salvaEmpresa:(Empresa *) novaEmpresa {
2
if (!catalogo) {
3
catalogo = [[NSMutableArray alloc] init];
4
}
5
6
[catalogo addObject:novaEmpresa];
7 }
Na linha 6 adicionamos na lista o objeto novaEmpresa passado como argu-
mento ao método. Já as linhas 2 e 3 precisam de uma explicação mais detalhada: em
Objective-C objetos não-instanciados contêm por padrão o valor nil (que é um
primo próximo do NULL de Java, C# e do próprio C e C++). Além disso, na lingua-
gem os valores nil e 0 (zero) são tratados como falso em expressões condicionais,
42
Casa do Código
Capítulo 3. Mais Objective-C e Xcode
da mesma forma que qualquer coisa que não seja nil ou 0 é considerada como ver-
dadeiro em condicionais booleanas. Em outras palavras, os seguintes códigos são
equivalentes:
// OK
if (!catalogo) {
}
// OK - mesmo efeito do exemplo anterior
if (catalogo == nil) {
}
Por fim, na linha 3 criamos uma nova instância de fato do NSMutableArray
NSArray versus NSMutableArray - imutável e mutável
Algumas classes do SDK do iOS contêm versões imutáveis (que após
criadas não podem mais ser modificadas) e versões mutáveis (que po-
dem ser modificadas livremente), como é o caso do NSArray (imutá-
vel) e NSMutableArray (mutável). Saber quando usar uma versão ou
outra depende exclusivamente das necessidades de cada parte do código.
Outras classes imutáveis que têm versões mutáveis são NSDictionary,
NSSet, NSData e NSString.
3.14
Listando todas as empresas do catálogo
Aproveitando que estamos embalados, vamos criar também um outro método que
lista todas as empresas adicionadas ao catalogo. Adicione o seguinte código logo
após o método salvaEmpresa:
-(void) mostraCatalogo {
NSLog(@"******* Listando todas empresas *******");
for (Empresa *empresa in catalogo) {
NSLog(@"A empresa %@ tem %d funcionários",
empresa.nome, empresa.quantidadeFuncionarios);
}
}
43
3.15. Vença a sintaxe do Objective-C: invocação de métodos
Casa do Código
Modifique o método salvar: para remover a antiga chamada a NSLog, e in-
voque os dois novos métodos que criamos. Confira abaixo:
- (IBAction)salvar:(id)sender {
Empresa *e = [[Empresa alloc] init];
e.nome = self.nomeField.text;
e.quantidadeFuncionarios = [self.quantidadeField.text intValue];
[self salvaEmpresa:e];
[self mostraCatalogo];
}
Rode novamente o aplicativo no simulador através da tecla de atalho Command
+ R (ou pelo menu... você ainda lembra
qual é?) e insira algumas empresas, para ver
o resultado do aplicativo até o momento.
3.15
Vença a sintaxe do Objective-C: invocação de
métodos
A assinatura de métodos em Objective-C é algo bastante particular da linguagem, e
pode ser um pouco criptográfico numa primeira olhada. Uma das intenções dos cri-
adores da linguagem foi criar uma sintaxe declarativa e fácil de ler, que não deixasse
margem para dúvidas em relação ao que se refere cada valor passado ao método. Se
isso é algo bom ou ruim, cabe a você decidir.
Considere o seguinte código, retirado da classe NSMutableArray: