Переопределение метода установки и получение информации

StackOverflow https://stackoverflow.com/questions/745174

Вопрос

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

Позже в пользовательском методе инициализации я устанавливаю еще одну переменную экземпляра (numberOfSides), но мне нужно убедиться, что минимумNumberOfSides и MaximumNumberOfSides установлены правильно в пределах границ.Я попытался изменить возвращаемое значение установщика на BOOL, чтобы я мог передать обратно ДА или НЕТ, если это удалось/не удалось, но это создало конфликтующий метод, я предполагаю, потому что я использую синтез и переопределяю установщик.

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

-(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;
}
Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

редактировать: Вот еще один вопрос ТАК здесь подробно рассматривается обработка исключений в Objective-C.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top