Методы делегирования Objective-C с более конкретными типами параметров

#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 , то указание более конкретного типа было бы чрезмерным указанием типа аргумента относительно того, что на самом деле ожидает код. Если код действительно будет работать с более общим типом, то вам следует рассмотреть возможность использования этого более общего типа.