Question

I ai un mutateur (les) setMinimumNumberOfSides que je veux remplacer après l'utilisation de la synthèse. Dans ce document, je mets une contrainte sur la variable d'instance pour vous assurer que l'int est dans certaines limites.

Plus tard dans une méthode d'initialisation personnalisée, je une autre variable de réglage (exemple de numberOfSides), mais je dois vous assurer que minimumNumberOfSides et maximumNumberOfSides a été fixé correctement dans des limites. J'ai essayé de changer la valeur de retour sur le setter à un BOOL, pour que je puisse passer de nouveau un OUI ou NON si elle a réussi / échoué, mais qui a créé une méthode contradictoire, je suppose que j'utilise la synthèse et le poseur remplaçant.

Comment puis-je obtenir les informations facilement pour vérifier si le poseur a été appelé et renvoyé avec succès?

-(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;
}
Était-ce utile?

La solution

Vous n'avez pas à synthétiser numberOfSides si vous avez l'intention de mettre en œuvre le getter et setter. Sans @synthesize numberOfSides vous pouvez retourner un BOOL si vous choisissez. Vous devez déclarer le getter / setter dans votre interface en conséquence.

BTW, une autre approche serait d'utiliser le getter synthétisé / setter et ajouter une -(BOOL)isNumberOfSidesValid méthode séparée qui effectue cette vérification.

Autres conseils

Dans une telle situation, vous pourriez être mieux à l'aide d'un simple appel à assert(), ou lancer une exception.

Le choix dépendra de la façon dont vous voyez cette classe utilisée. Si elle fera partie d'une bibliothèque, et vous attendre à d'autres développeurs de fournir fréquemment des valeurs incorrectes pour minimumNumberOfSides ou maximumNumberOfSides, vous devriez probablement jeter une exception appropriée.

Un mot d'avertissement, cependant. Si vous vous attendez à utilisateurs de votre application pour fournir fréquemment des valeurs incorrectes, une exception est une mauvaise idée. La gestion des exceptions en Objective-C est une opération coûteuse. Si ces contrôles sont en place pour le bien de l'utilisateur, vous devez effectuer la validation des entrées, et signaler les erreurs à l'utilisateur d'une manière beaucoup plus conviviale.

modifier: Voici un code rapide exemple:

-(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;
}

modifier: Voici une autre question SO qui va dans les détails sur la gestion des exceptions en Objective-C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top