sábado, 14 de dezembro de 2013

Atributos em Objective-C

Como qualquer outra linguagem com paradigma OO, o Objective-C permite a criação de atributos nas classes para que eles possam armazenar dados.

Para quem está acostumado, por exemplo, com atributos e métodos get e set da linguagem Java, o mais próximo que podemos fazer em Objective-C é o que pode ser visto abaixo.
No arquivo .h definimos o atributo numEscotilhas e os métodos get (numeroEscotilhas) e set (setNumeroEscotilhas:)

#import "Veiculo.h"
#import "Planeta.h"

@interface Nave : Veiculo

(int) numeroEscotilhas;

- (void) orbitarNave:(Planeta *) planeta naAltitude:(double)km;

- (void) setNumeroEscotilhas:(int) num;
- (int) numeroEscotilhas;

@end

No arquivo .m fazemos a implementação dos métodos:

#import "Nave.h"

@interface Nave

@implementation Nave

- (void) orbitarNave:(Planeta *) planeta naAltitude:(double)km {
    
}

- (void) setNumeroEscotilhas:(int) num {
    numeroEscotilhas = num;
}

- (int) numeroEscotilhas {
    return numeroEscotilhas;
}


@end

Realmente, é bastante parecido com o que fazemos em Java. Entretanto, com Objetive-C podemos fazer esse trabalho de uma forma mais simples.
Suponha que desejamos criar um atributo para a velocidade da nave. A definição ficaria da seguinte forma:

#import "Veiculo.h"
#import "Planeta.h"

@interface Nave : Veiculo

@property (nonatomic) int velocidade;

- (void) orbitarNave:(Planeta *) planeta naAltitude:(double)km;


@end

Definimos uma @property e usamos (nonatomic) para especificar que o atributo não será thread-safe, que é o caso mais comum os atributos das classes. Já o arquivo .m ficará da seguinte maneira:

#import "Nave.h"

@implementation Nave

@synthesize velocidade = _velocidade;

- (void) orbitarNave:(Planeta *) planeta naAltitude:(double)km {
    
}


@end

Usamos @synthesize para definir os métodos get e set "automaticamente" pelo compilador, isto é, não vamos fazer os métodos manualmente, mas eles existem e tem a seguinte forma:

#import "Nave.h"

@implementation Nave

@synthesize velocidade = _velocidade;

- (void) orbitarNave:(Planeta *) planeta naAltitude:(double)km {
    
}

- (void) setVelocidade:(int)velocidade {
    _velocidade = velocidade;
}

- (int) velocidade{
    return _velocidade;
}


@end

Uma coisa que você pode estranhar é o fato de criar uma "nova" variável com underscore (_velocidade). Isto acontece para o compilador não se confundir se estamos chamando o método ou a variável (lembre que o método get tem o nome nome da property).

Nada impede, entretanto, que criemos nossa própria versão de um (ou dos dois) métodos. Imagine que não quero que a velocidade seja negativa, sendo assim, poderíamos ter uma versão assim:

#import "Nave.h"

@implementation Nave

@synthesize velocidade = _velocidade;

- (void) orbitarNave:(Planeta *) planeta naAltitude:(double)km {
    
}

- (void) setVelocidade:(int)velocidade {
    if (velocidade < 0) {
        velocidade = 0;
    }
    _velocidade = velocidade;
}


@end

O método get permanece sendo gerado, mas o método set usado vai ser o que foi definido manualmente.

Vamos ficar por aqui. No próximo post mostraremos como fazer chamadas de métodos usando a linguagem Objective-C.

Até lá.

Nenhum comentário:

Postar um comentário