Continuando nossa série de estudos sobre Objective-C, depois de aprendermos sobre a classe NSString
chegou a hora da classe NSNumber
e seus métodos de conversões de tipos de dados.
Pré-requisitos
- Conhecer o trabalho com classes e propriedades;
- Conhecer o trabalho com métodos;
- Conhecer a classe
NSString
.
♫ Smooth Criminal, da banda 2CELLOS ♪
Conceitos
Quando começamos os estudos de uma linguagem de programação, além do famoso “OláMundo”, não temos como fugir dos exercícios e testes iniciais com textos e números. Já que no artigo passado eu ensinei um pouco do trabalho com texto, vamos agora mexer com números e alguns recursos da classe NSNumber
.
A primeira questão é que, por mais que exista uma classe para trabalhar com números em Objective-C, o núcleo da coisa e principalmente de equações e cálculos ainda são feitos com a boa e velha linguagem C. Isso quer dizer que os tipos int
e float
seguem firme na programação de aplicativos.
Como a proposta desses artigos é bem prática, vou deixar para explicar boa parte dos novos conceitos durante o exercício prático.
Prática
Vamos criar um novo projeto chamado Classe_NSNumber e começar com as seguintes definições:
O primeiro comentário aqui é quanto à declaração dos objetos. Reparem que não primeira abordagem eu usei um método de criação de um NSNumber
a partir de um valor int
. Esse método efetua a operação correspondente a um alloc
/init
tradicional. Essa era a abordagem mais comum para criação de objetos NSNumber
até pouco tempo atrás.
Já a segunda abordagem mostra a sintaxe mais recente e infinitamente mais fácil de se criar um objeto NSNumber
. Basta inserir um @ antes do número e o sistema já entende que deve tratá-lo como objeto e não tipo primitivo (tipos de C).
Acho importante mostrar as duas versões porque, por mais fácil que seja a segunda forma, quem começar a estudar agora ainda vai encontrar muitos livros, tutoriais e materiais em geral usando a primeira abordagem. Então, pelo sim e pelo não, mostro as duas. 😉
Tendo nossos dois objetos criados, podemos brincar um pouco com eles. Na imagem a seguir eu defino uma expressão simples que utiliza ambas as variáveis para fazer um cálculo:
Notem que ao definir a equação temos uma exibição instantânea de erro no Xcode. A questão é que objetos NSNumber
não podem ser usados diretamente para cálculos matemáticos. Lembram que eu comentei no começo do artigo que ainda usávamos os tipos primitivos de C?! Pois bem, a hora é essa.
Um NSNumber
tem como função armazenar um valor numérico na forma de um elemento orientado a objetos. Um exemplo de uso é com a classe NSArray
(tema do próximo artigo), que não suporta números primitivos (int
, float
) e por isso requer objetos NSNumber
.
Para solucionar isso, nós precisamos usar alguns métodos que convertem os valores armazenados para versões primitivas que podem efetuar cálculos. Percebam as mudanças:
No código acima eu usei dois dos métodos mais comuns para essas situações de conversão de objetos NSNumber
. Tivemos uma operação para converter para int
e outra para converter para float
. Para deixar a coisa separada e mais didática, preferi deixar bem explícitas as conversões em novas variáveis. Notem que, com os valores convertidos no NSLog
, consegui efetuar os cálculos. Eu poderia ter usado o tipo NSInteger
, mas vou deixar para falar dele mais para frente.
No dia-a-dia essa conversão poderia ser feita direto dentro do NSLog
ou mesmo na atribuição de um objeto NSNumber
para guardar o resultado. Observem:
É aqui que os iniciantes se confundem e começam a torcer o nariz para a programação — quando temos o resultado de métodos dentro de outros métodos ou funções. Não é nada difícil, mas como o código fica maior e com mais elementos (colchetes, parênteses e afins), se não prestarmos atenção é confusão na certa.
Em linhas gerais, os trabalhos mais comuns com NSNumber
são converter valores primitivos para objetos e vice-versa. Apesar de ainda não termos entrado em interface gráfica, um método que será útil em aulas futuras é o que converte números em textos.
O método stringValue
tem como objetivo converter
um objeto NSNumber
em uma versão de texto. Às vezes é a forma mais simples e prática para exibir um valor em um UILabel
, por exemplo. Já se o intuito for exibir em texto o resultado de um cálculo com valores primitivos, podemos usar o método que eu comentei no último artigo, o stringWithFormat
.
Para essa proposta inicial, esses métodos já fornecerão a vocês uns bons testes e estudos. Lembrem-se sempre que uma das melhores formas de aprender uma linguagem de programação é “fuçando”, então testem esses conceitos com tópicos antigos. Tentem criar códigos que mesclem o que já vimos, isso ajuda bastante.
No próximo post vou fazer um apanhado dos últimos artigos, criando códigos mais completos e com diferentes tipos de dados — tudo junto. Por enquanto, abro espaço para dúvidas e debates no tópico oficial, no fórum da Quaddro.
Um abraço e até a próxima!