2009-04-13 6 views
7

J'ai une méthode setter (setMinimumNumberOfSides) que je veux remplacer après avoir utilisé synthesize. Dans celui-ci, je mets une contrainte sur la variable d'instance pour m'assurer que l'int est dans certaines limites. Plus tard dans une méthode init personnalisée, je suis en train de définir une autre variable d'instance (numberOfSides), mais je dois m'assurer que minimumNumberOfSides et maximumNumberOfSides ont été correctement définis dans les limites. J'ai essayé de changer la valeur de retour sur le setter pour un BOOL, donc je pourrais repasser un OUI ou NON s'il réussissait/échouait, mais cela créait une méthode contradictoire, je devine parce que j'utilise synthétiser et écraser le setter.Substitution d'une méthode Setter et obtention d'informations

Comment puis-je obtenir facilement les informations pour vérifier si le setter a été appelé et retourné 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; 
} 

Répondre

7

Vous n'avez pas besoin de synthétiser numberOfSides si vous envisagez d'implémenter le getter et le setter. Sans @synthesize numberOfSides vous pouvez renvoyer un BOOL si vous le souhaitez. Vous devez déclarer le getter/setter dans votre interface en conséquence. Par ailleurs, une autre approche consisterait à utiliser le getter/setter synthétisé et à ajouter une méthode séparée -(BOOL)isNumberOfSidesValid qui effectue cette vérification.

+0

Battez-moi. +1 –

3

Dans une situation comme celle-ci, il vaut mieux appeler simplement assert() ou déclencher une exception.

Le choix dépendra de la façon dont vous voyez cette classe utilisée. Si cela fait partie d'une bibliothèque et que vous vous attendez à ce que d'autres développeurs fournissent fréquemment des valeurs incorrectes pour minimumNumberOfSides ou maximumNumberOfSides, vous devriez probablement lancer une exception appropriée.

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

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 another SO question qui va dans les détails sur la gestion des exceptions en Objective-C.

Questions connexes