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;
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top