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;
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top