Substituindo um método setter, e recebendo informação fora
-
09-09-2019 - |
Pergunta
Eu tenho um método setter (setMinimumNumberOfSides) que eu quero substituir após o uso de sintetizar. Nele, eu estou colocando em uma restrição sobre a variável de instância para garantir que o int é dentro de certos limites.
Mais tarde, em um método init personalizado, eu estou definindo uma outra variável de instância (numberOfSides), mas eu preciso ter certeza de que minimumNumberOfSides e maximumNumberOfSides foi definido correctamente dentro dos limites. Eu tentei mudar o valor de retorno sobre o setter para um BOOL, para que eu pudesse passar de volta um sim ou não se conseguiu / falhou, mas que criou um método conflitantes, eu estou supondo porque eu estou usando sintetizar e substituindo o setter.
Como posso obter a informação com facilidade para verificar para ver se o setter foi chamado e retornou com sucesso?
-(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;
}
Solução
Você não tem que sintetizar numberOfSides se você está pensando em implementar o getter e setter. Sem @synthesize numberOfSides
você pode retornar um BOOL se você escolher. Você precisa declarar o getter / setter em sua interface em conformidade.
BTW, outra abordagem seria usar o sintetizado getter / setter e adicionar um -(BOOL)isNumberOfSidesValid
método separado que executa essa verificação.
Outras dicas
Em uma situação como esta, você pode ser melhor fora de usar uma simples chamada para assert()
, ou lançar uma exceção.
A escolha vai depender de como você vê essa classe que está sendo usado. Se ele vai ser parte de uma biblioteca, e espera que outros desenvolvedores para fornecer frequentemente valores incorretos para minimumNumberOfSides
ou maximumNumberOfSides
, você provavelmente deve lançar uma exceção adequada.
Uma palavra de alerta, no entanto. Se você espera que o usuários do seu aplicativo com freqüência fornecer valores incorretos, em seguida, uma exceção é uma má idéia. manuseamento de excepção no Objectivo-C é uma operação cara. Se estas verificações estão em vigor para o bem do usuário, você deve executar a validação de entrada e erros de relatório para o usuário de uma maneira muito mais amigável.
Editar: Aqui está um código de exemplo rápida:
-(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;
}
Editar: Aqui está outra questão SO que vai entrar em pormenores sobre a exceção de manuseamento em Objective-C.