Classi in Objective-C

di il
9 risposte

Classi in Objective-C

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

  • Re: Classi in Objective-C

    Ma quel segno '-' davanti ai metodi cosa significa?
  • Re: Classi in Objective-C

    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.
  • Re: Classi in Objective-C

    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;
    }
    
  • Re: Classi in Objective-C

    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ù ...

  • Re: Classi in Objective-C

    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.
  • Re: Classi in Objective-C

    Chiarissimo. Grazie!
  • Re: Classi in Objective-C

    Salve a tutti, scusate se mi intrometto ma perché self si deve puntare al metodo init della superclasse??
     self=[super init] 
  • Re: Classi in Objective-C

    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.
  • Re: Classi in Objective-C

    Ciao della, non so perché ma non riesco a capirla , forse perché non ho capito molto bene il self. a riguardo ho messo un thread apposito, se vuoi dacci un'occhiata

    https://www.iprogrammatori.it/forum-programmazione/apple-ios-objectivec/self-t14443.html

    grazie mille ancora
Devi accedere o registrarti per scrivere nel forum
9 risposte