2009-04-13 7 views
7

Ho un metodo setter (setMinimumNumberOfSides) che voglio sovrascrivere dopo aver usato sintetizzare. In esso, inserisco un vincolo sulla variabile di istanza per assicurarmi che l'int sia entro certi limiti.Sovrascrittura di un metodo setter e ricezione di informazioni

Successivamente in un metodo di inizializzazione personalizzato, sto impostando un'altra variabile di istanza (numberOfSides), ma è necessario assicurarsi che minimumNumberOfSides e maximumNumberOfSides siano stati impostati correttamente entro i limiti. Ho provato a cambiare il valore di ritorno del setter su un BOOL, così ho potuto restituire un YES o NO se è riuscito/fallito, ma questo ha creato un metodo in conflitto, sto supponendo perché sto usando sintetizzare e sovrascrivere il setter.

Come posso ottenere facilmente le informazioni per verificare se il setter è stato chiamato e restituito correttamente?

-(void)setNumberOfSides:(int)sides 
{ 
    if ((sides < maximumNumberOfSides) && (sides > minimumNumberOfSides)) 
    { 
     numberOfSides = sides; 
    } 
    else 
     NSLog (@"Invalid number of sides: %d is outside the constraints allowed", sides); 


} 

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum > 2) 
     minimumNumberOfSides = minimum; 

} 

-(void)setMaximumNumberOfSides:(int)maximum 
{ 
    if (maximum <= 12) 
     maximumNumberOfSides = maximum; 

} 

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max 
{ 
    if (self = [super init]) 
    { 
     self.minimumNumberOfSides = min; 
     self.maximumNumberOfSides = max; 

     self.numberOfSides = sides; 
    } 
    return self; 
} 

risposta

7

Non è necessario sintetizzare numberOfSides se si prevede di implementare getter e setter. Senza @synthesize numberOfSides è possibile restituire un BOOL se si sceglie. Dovrai dichiarare il getter/setter nella tua interfaccia di conseguenza.

BTW, un altro approccio sarebbe utilizzare il getter/setter sintetizzato e aggiungere un metodo separato -(BOOL)isNumberOfSidesValid che esegue questo controllo.

+0

Mi picchia. +1 –

3

In una situazione come questa, è preferibile usare una semplice chiamata a assert() o lanciare un'eccezione.

La scelta dipenderà dal modo in cui si vede questa classe utilizzata. Se farà parte di una libreria e ci si aspetta che altri sviluppatori forniscano frequentemente valori errati per minimumNumberOfSides o maximumNumberOfSides, probabilmente si dovrebbe generare un'eccezione appropriata.

Una parola di avvertimento, però. Se si prevede che gli utenti della propria applicazione forniscano spesso valori errati, un'eccezione è una cattiva idea. La gestione delle eccezioni in Objective-C è un'operazione costosa. Se questi controlli sono in atto per il bene dell'utente, è necessario eseguire la convalida dell'input e segnalare gli errori all'utente in un modo molto più amichevole.

edit: Ecco alcuni esempi di codice rapido:

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum <= 2) 
    { 
     [NSException raise:@"invalid minimumNumberOfSides value" 
        format:@"value of %d is too low (must be > 2)", minimum]; 
    } 

    minimumNumberOfSides = minimum; 
} 

edit: Ecco another SO question che va in dettaglio sulla gestione delle eccezioni in Objective-C.