Переопределение метода установки и получение информации - PullRequest
7 голосов
/ 14 апреля 2009

У меня есть метод установки (setMinimumNumberOfSides), который я хочу переопределить после использования синтеза. В нем я накладываю ограничение на переменную экземпляра, чтобы убедиться, что int находится в определенных пределах.

Позже в пользовательском методе init я устанавливаю другую переменную экземпляра (numberOfSides), но мне нужно убедиться, что в пределах границ были правильно установлены минимальные значения NumberNumberOfSides и MaximumNumberOfSides. Я попытался изменить возвращаемое значение в установщике на BOOL, чтобы я мог вернуть YES или NO, если это было успешно / неудачно, но это создало конфликтный метод, я предполагаю, потому что я использую синтез и переопределение сеттера.

Как я могу легко получить информацию, чтобы проверить, был ли сеттер вызван и возвращен успешно?

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

Ответы [ 2 ]

7 голосов
/ 14 апреля 2009

Вам не нужно синтезировать numberOfSides, если вы планируете реализовать метод получения и установки. Без @synthesize numberOfSides вы можете вернуть BOOL, если захотите. Вам нужно будет соответственно объявить getter / setter в вашем интерфейсе.

Кстати, другой подход - использовать синтезированный метод получения / установки и добавить отдельный метод -(BOOL)isNumberOfSidesValid, который выполняет эту проверку.

3 голосов
/ 14 апреля 2009

В такой ситуации вам может быть лучше использовать простой вызов assert() или вызвать исключение.

Выбор будет зависеть от того, как вы видите, как используется этот класс. Если она будет частью библиотеки и вы ожидаете, что другие разработчики будут часто указывать неверные значения для minimumNumberOfSides или maximumNumberOfSides, вам, вероятно, следует выдать правильное исключение.

Слово предупреждения, хотя. Если вы ожидаете, что пользователи вашего приложения будут часто указывать неверные значения, исключение - плохая идея. Обработка исключений в Objective-C - дорогостоящая операция. Если эти проверки выполняются ради пользователя, вы должны выполнить проверку ввода и сообщить пользователю об ошибках гораздо более дружественным образом.

edit: Вот небольшой пример кода:

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

edit: Вот еще один SO вопрос , который подробно описывает обработку исключений в Objective-C.

...