O ideal para programar em Objective-C é usar o Mac e a IDE oficial XCode, mas podemos fazer programas em outros sistemas operacionais. Para usar no Linux, basta instalar o gcc, o gobjc e o gnustep-devel no sistema.
Os programas em Objective-C são colocados em arquivos com a extensão .m, e arquivos de cabeçalho usam .h, assim como em C e C++.
Esse é o olá mundo em Objective-C:
#import <Foundation/Foundation.h> // Importação da biblioteca Foundation, necessária pros programas básicos em Objective-C
int main(int argc, const char *argv[]) { // Método principal, com parâmetros que serão recebidos via linha de comando
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Criação do objeto de liberação automática
NSLog(@"Olá, Mundo!"); // Método de saída
[pool drain]; // Liberação do receptor pool, usando o método drain do objeto
return 0; // Retorno do método main, 0 significa execução com sucesso
}
Para compilar, usamos esse comando (podemos colocar num makefile também):
gcc olamundo.m -I /usr/include/GNUstep/ -L /usr/lib/GNUstep/ -l objc -lgnustep-base -fconstant-string-class=NSConstantString -lm -ldl -fobjc-exceptions -o olamundo -no-pie
Os comentários são feitos da mesma forma que em C:
// Comentário de uma linha
/*
Comentário
de
várias
linhas
*/
Os tipos primitivos Básicos consistem em tipos aritméticos inteiros e de ponto-flutuante. Veja abaixo os tipos:
Tipo | Tamanho | Faixa de Valores |
---|---|---|
char | 1 byte | -128 a 127 |
unsigned char | 1 byte | 0 a 255 |
signed char | 1 byte | -128 a 127 |
int | 4 bytes | -2147483648 a 2147483647 |
unsigned int | 4 bytes | 0 a 4294967295 |
short | 2 bytes | -32,768 a 32,767 |
unsigned short | 2 bytes | 0 a 65,535 |
long | 4 bytes | -2147483648 a 2147483647 |
unsigned long | 4 bytes | 0 a 4294967295 |
float | 4 bytes | 3.4E-38 a 3.4E+38 (até 6 casas decimais) |
double | 8 bytes | 1.7E-308 a 1.7E+308 (até 15 casas decimais) |
long double | 12 bytes | 3.4E-4932 a 1.1E+4932 (até 19 casas decimais) |
bool | 1 byte | true/false |
char[] | 1 byte por caractere | Textos em Geral |
PS: Letras únicas em char se coloca entre aspas simples, cadeias de caracteres se coloca entre aspas duplas.
Uma declaração simples de variáveis seria assim:
#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int numero = 50;
float real = 9.85;
char letra = 'A';
char* frase = "Isso é uma String!";
const bool LOGICO = true; // Constante, não pode ser alterada
// Formatações tipo o printf do C:
NSLog(@"%d", numero);
NSLog(@"%.2f", real);
NSLog(@"%c", letra);
NSLog(@"%s", frase);
NSLog(@"%s", LOGICO ? "true" : "false");
[pool drain];
return 0;
}
As máscaras de formatação são as mesmas do C, %s
para ponteiro de char, %c
para char único, %d
para inteiros, %f
para reais e %p
para ponteiros. As formatações usando eles também são os mesmos (tipo %.1f
).
PS: No caso de strings, é recomendável usar a classe NSString, assim:
NSString *frase = @"Isso é uma String!";
NSLog(@"%@", frase);
Para ler dados do teclado, usamos os mesmos comandos em C:
int main(int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int numero;
float real;
char letra;
char frase[25];
// Inclua stdio.h igual se faz no C:
printf("Digite um número inteiro: "); // O printf não pula linha
scanf("%d", &numero);
printf("Digite um número real: ");
scanf("%f", &real);
fflush(stdin); // Limpeza buffer
printf("Digite uma única letra: ");
scanf("\n%c", &letra); // Pra evitar erros
fflush(stdin);
printf("Digite uma frase: ");
scanf("\n"); // Pra evitar erros
fgets(frase, 25, stdin);
system("clear"); // Inclua stdlib.h igual ao C
NSLog(@"%d", numero);
NSLog(@"%.2f", real);
NSLog(@"%c", letra);
NSLog(@"%s", frase);
[pool drain];
return 0;
}
Os operadores aritméticos em Objective-C são os mesmos do C e outras linguagens. Veja um exemplo de uso:
int main(int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int n1, n2, soma, subs, mult, divi, rest;
printf("Digite um número: ");
scanf("%d", &n1);
printf("Digite outro número: ");
scanf("%d", &n2);
soma = n1 + n2;
subs = n1 - n2;
mult = n1 * n2;
divi = n1 / n2;
rest = n1 % n2;
system("clear");
NSLog(@"A soma entre %d e %d é igual a %d.", n1, n2, soma);
NSLog(@"A subtração entre %d e %d é igual a %d.", n1, n2, subs);
NSLog(@"A multiplicação entre %d e %d é igual a %d.", n1, n2, mult);
NSLog(@"A divisão entre %d e %d é igual a %d com resto de %d.", n1, n2, divi, rest);
[pool drain];
return 0;
}
PS: Podemos também colocar atribuição com algum valor, como por exemplo num += 2
ou num -= 3
, que faça a atribuição e a operação juntos no mesmo comando. Concatenação com atribuição também pode ser colocada com o +=
.
Lembrando da ordem de precedência, que é a mesma de outras linguagens. Veja como exemplo um uso:
int main(int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
float nota1, nota2, media;
printf("Digite a primeira nota: ");
scanf("%f", ¬a1);
printf("Digite a segunda nota: ");
scanf("%f", ¬a2);
media = (nota1 + nota2) / 2;
system("clear");
NSLog(@"A média das notas é de %.1f.", media);
[pool drain];
return 0;
}
Veja outro exemplo:
int x, y, z, w;
printf("Digite um número: ");
scanf("%d", &x);
printf("Digite o valor à somar: ");
scanf("%d", &y);
z = x + y;
w = pow(x, 3); // Adicione Biblioteca math.h
NSLog(@"A soma de %d com %d equivale a %d.", x, y, z);
NSLog(@"%d elevado ao cubo: %d.", x, w);
PS: Para funções aritméricas, como o pow()
, é necessário adicionar a biblioteca math.h
.Veja algumas dessas funções abaixo:
abs()
para pegar o valor absoluto de um número.pow()
para criar uma potencialização entre dois números.sqrt()
para mostrar a raiz quadrada.cbrt()
para mostrar a raiz cúbica.round()
para mostrar o número arredondado para o inteiro mais próximo. Para cima se usa ceil()
e para baixo floor()
.rand()
para gerar um número aleatório, definindo o mínimo e o máximo.O NSString são objetos, portanto, possuem métodos para os manipularem. Esses são os métodos mais usados:
int main(int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *exemplo = @"Exemplo de String!";
const char *frase = "Isso é uma frase!";
NSString *comEsp = @" Frase para fazer o \"trim\"! ";
NSString *caixaAlta, *caixaBaixa, *concatenada, *subst, *novo, *extNum, *extReal, *extAlg, *semEsp;
const char* volta;
int tamanho;
bool compara;
int num, alg;
float real;
caixaAlta = [exemplo uppercaseString];
caixaBaixa = [exemplo lowercaseString];
concatenada = [exemplo stringByAppendingFormat: @" E mais alguma coisa!"];
subst = [exemplo stringByReplacingOccurrencesOfString: @"String" withString: @"Frase"];
novo = [[NSString alloc] initWithUTF8String: frase];
volta = [exemplo UTF8String];
tamanho = [exemplo length];
compara = [exemplo isEqualToString: caixaAlta];
semEsp = [comEsp stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
// Conversões:
extNum = @"50";
extReal = @"9.85";
alg = 15;
num = [extNum integerValue];
real = [extReal floatValue]; // também podemos usar doubleValue para valores double
extAlg = [NSString stringWithFormat: @"%d", alg];
NSLog(@"%@", caixaAlta);
NSLog(@"%@", caixaBaixa);
NSLog(@"%@", concatenada);
NSLog(@"%@", subst);
NSLog(@"%@", novo);
NSLog(@"%s", volta);
NSLog(@"%d", tamanho);
NSLog(@"%s", compara ? "igual" : "diferente");
NSLog(@"%@", semEsp);
NSLog(@"%d", num);
NSLog(@"%.2f", real);
NSLog(@"%@", extAlg);
[pool drain];
return 0;
}
Já variáveis char, são manipuladas da mesma forma que no C, como podem ver:
const char* frase = "90"; // Inclua stdlib.h
int novo = atoi(frase);
NSLog(@"%d", novo);
int numero = 50;
char texto[10];
sprintf(texto, "%i", numero); // Pode ser usado também pra concatenar variáveis de vários tipos
NSLog(@"%s", texto);
char letra = 'a'; // Inclua ctype.h
char maiuscula = toupper(letra); // Pra minúscula use tolower
NSLog(@"%c", maiuscula);