#objective-c
#objective-c
Вопрос:
В Objective-C считается хорошей или плохой практикой заменять типы аргументов более конкретными типами аргументов (подкласса) в вашей реализации метода делегирования / протокола?
Например, согласно документации для UIGestureRecognizer:
Вызываемые методы действий должны соответствовать одной из следующих сигнатур: - (недействительный) порядок обработки; - (void)handleGesture:(UIGestureRecognizer *)Распознаватель жестов;
Когда я добавляю UITapGestureRecognizer в представление, я знаю, что аргумент для handleGesture:
будет иметь тип UITapGestureRecognizer (если только позже не будет добавлен другой распознаватель жестов). Не одобряется ли замена аргумента UIGestureRecognizer аргументом типа UITapGestureRecognizer? Например:
- (void)handleGesture:(UITapGestureRecognizer *)Распознаватель жестов { // реализация }
Ответ №1:
Протоколы не позволят вам этого сделать, поскольку типы аргументов являются частью спецификации протокола. Но вы можете и часто должны делать это с помощью методов действий. Я видел код для методов действий, который выглядит следующим образом:
- (void)somethingOrOtherAction:(id)sender
{
UIButton *button = (UIButton *)sender;
/* do something with |button| */
}
Этот код работает только тогда, когда отправителем является кнопка, поэтому нет причин для того, чтобы тип аргумента был каким-либо иным, чем UIButton *
. Что касается сгенерированного кода, они оба являются указателями на объекты, так что один ничем не хуже другого. Но устранение приведения делает код более чистым, а также раскрывает ваши намерения.
Единственное, что возражает против этого в вашем случае, это то, что, если вы на самом деле не используете ничего, что UITapGestureRecognizer
предлагает больше UIGestureRecognizer
, то указание более конкретного типа было бы чрезмерным указанием типа аргумента относительно того, что на самом деле ожидает код. Если код действительно будет работать с более общим типом, то вам следует рассмотреть возможность использования этого более общего типа.