Classi in Objective-C

di Anonimizzato9942 il
9 risposte
In questo thread su richiesta di altri utenti (che brontolano un sacco sulla sintassi di Objective-c) volevo discutere di come si scrive una classe.

inizo con una classe semplice:

// file .h

@interface MyPoint : NSObject
@property double X;
@property double Y;
-(id) initX:(double)x andY:(double)y;
@end

// file .m

@implementation MyPoint
@synthesize X;
@synthesize Y;

-(id) initX:(double)x andY:(double)y
{
    X = x;
    Y = y;
    return self;
}
@end
un altro modo di fare la stessa cosa è:

// file .h

@interface MyPoint : NSObject
{
    double x;
    double y;	
}
-(void) setX: (double) ax;
-(void) setY: (double) ay;
-(double) getX;
-(double getY;

-(id) initX:(double)ax andY:(double)ay;
@end

// file .m

@implementation MyPoint

-(id) initX:(double)ax andY:(double)ay
{
    self = [super init];
    if (self){
       [self setX: ax];
       [self setY: ay];
    }
    return self;
}

-(void) setX: (double) ax {
    x = ax;
}

-(void) setY: (double) ay {
    y = ay;
}

-(double) getX {
    return x;
}

-(double) getY {
    return y;
}
@end
Evidentemente l' uso delle property è da incoraggiare. In SetX/SetY il parametro è stato chiamato ax/ay per non collidere col nome del campo.

EDIT: sono state fatte alcune modifiche (vedi i post sucessivi)

9 Risposte

  • Ma quel segno '-' davanti ai metodi cosa significa?
  • Se il nome di un metodo è preceduto dal '-' è un metodo di istanza, cioè che puoi richiamare su una istanza della classe (ovvero su un oggetto).

    Se il nome di un metodo è preceduto dal '+' è un metodo di classe (in altri linguaggi è chiamato metodo statico), e lo puoi richiamare senza bisogno di istanziare un oggetto.
  • Nella riga
    @property (readwrite) double X;
    il "readwrite" può essere omesso, in quanto per default tutte le proprietà sono di tipo readwrite.

    Un consiglio per quanto riguarda il metodo "init" è quello di richiamare sempre il metodo della superclasse:
    
    -(id) initX:(double)x andY:(double) y
    {
       self = [super init];
       if (self){
            self.X = x;
            self.Y = y;
       }
       return self;
    }
    
  • Ciao Della
    Ho modificato il codice come hai indicato.
    Mi dici qualcosa riguardo a quell ' 'if self ...' ? Intuisco a cosa serve ma se hai qualche info in più ...

  • Ciao Barba! Praticamente quel controllo equivale a
    if (self != nil) {
     ...
    }
    Questo può essere utile perché può capitare che il metodo init fallisca.
    Considera ad esempio un metodo "initWithFile: " che accetta come parametro il percorso di un file che verrà usato ad esempio per la configurazione di un oggetto. Se il file specificato da tale percorso non esiste, allora il metodo initWithFile: non può essere eseguito correttamente, e in questo caso è buona regola restituire "nil" piuttosto che un oggetto non completamente configurato.

    In realtà nel caso in cui un oggetto discenda direttamente da NSObject (come nel tuo esempio) è praticamente impossibile che il metodo init di NSObject fallisca, però è buona regola effettuare sempre questo controllo.
  • Chiarissimo. Grazie!
  • Salve a tutti, scusate se mi intrometto ma perché self si deve puntare al metodo init della superclasse??
     self=[super init] 
  • Ciao! Quell'assegnamento serve per il discorso fatto prima, ovvero che in caso di fallimento, il metodo init dovrebbe restituire nil. Quindi in questo modo si può controllare l'esito di tale metodo.
Devi accedere o registrarti per scrivere nel forum
9 risposte