Переопределение метода установки и получение информации
-
09-09-2019 - |
Вопрос
У меня есть метод установки (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.