Override di un metodo setter, e ottenere informazioni fuori
-
09-09-2019 - |
Domanda
Ho un metodo setter (setMinimumNumberOfSides) che voglio ignorare dopo l'utilizzo di sintetizzare. In esso, sto mettendo in un vincolo sulla variabile di istanza per assicurarsi che l'int è entro certi limiti.
Più tardi in un metodo init personalizzato, sto impostando un'altra variabile di istanza (NumberOfSides), ma ho bisogno di assicurarsi che minimumNumberOfSides e maximumNumberOfSides è stato impostato correttamente entro certi limiti. Ho provato a cambiare il valore di ritorno sul setter per un BOOL, così ho potuto passare di nuovo un SI o NO se è riuscito / fallito, ma che ha creato un metodo in conflitto, sto cercando di indovinare perché sto utilizzando sintetizzare e sovrascrivendo il setter.
Come posso ottenere le informazioni fuori facilmente per controllare per vedere se il setter è stato chiamato ed è tornato con successo?
-(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;
}
Soluzione
Non c'è bisogno di sintetizzare NumberOfSides se avete intenzione di attuare il getter e setter. Senza @synthesize numberOfSides
è possibile restituire un BOOL se si sceglie. Avrete bisogno di dichiarare il getter / setter nell'interfaccia di conseguenza.
A proposito, un altro approccio sarebbe quello di utilizzare il getter / setter sintetizzato e aggiungere un metodo -(BOOL)isNumberOfSidesValid
separato che esegue questo controllo.
Altri suggerimenti
In una situazione come questa, potrebbe essere meglio utilizzare una semplice chiamata al assert()
, o un'eccezione.
La scelta dipenderà da come si vede questa classe in uso. Se sarà parte di una libreria, e si aspetta altri sviluppatori per la fornitura di frequente valori non corretti per minimumNumberOfSides
o maximumNumberOfSides
, probabilmente si dovrebbe buttare un'eccezione corretta.
Una parola di avvertimento, però. Se si prevede che il gli utenti dell'applicazione per fornisco spesso valori non corretti, quindi un'eccezione è una cattiva idea. La gestione delle eccezioni in Objective-C è un'operazione costosa. Se questi controlli sono in atto per il bene degli utenti, è necessario eseguire la convalida di ingresso, e segnalare gli errori per l'utente in maniera molto più amichevole.
Modifica 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;
}
Modifica Qui è un'altra domanda SO che va in dettaglio sulla gestione delle eccezioni in Objective-C.