Почему (id) отправитель вместо (UIButton *) отправитель - PullRequest
3 голосов
/ 13 мая 2011

Я пытаюсь узнать о Objective-C для разработки для iPhone, и, просматривая примеры действий, я часто видел такие вещи, как:

- (IBAction)sliderMoved:(id)sender
{
    UISlider *aSlider = (UISlider *)sender;
    //rest of code goes here...
}

Какова цель получения типа (id) изатем сразу же приводим его к (UISlider *).Почему бы просто не иметь следующее:

- (IBAction)sliderMoved:(UISlider *)aSlider;
{
    //rest of code goes here...
}

Есть ли техническая причина для этого, или это просто соглашение или сделано для удобства чтения?

Заранее спасибо,

  • Тимо

Ответы [ 4 ]

6 голосов
/ 13 мая 2011

Я полагаю, что это соглашение, которое вытекает из того факта, что не всегда 1: 1 отображает UIControl в IBAction.Например, вы можете иметь UISwitch, UIButton и UITextField, все сопоставленные с методом - (IBAction)syncUI:(id)sender;.В этом случае невозможно указать тип.

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

3 голосов
/ 13 мая 2011

На самом деле вы можете указать отправителя как UIButton*, если хотите, и если вы абсолютно уверены, что это действие никогда не должно запускаться никаким другим видом объекта.Это может даже подойти, если действие зависит от типа отправителя.Однако обычно тип отправителя не имеет значения для контроллера, и указание его как id дает вам гибкость в изменении вида без необходимости изменять контроллер.

Одна из причин, по которой вы можете этого захотетьГибкость, даже если вы знаете, что всегда будете использовать кнопку в своем приложении для рассматриваемого действия, заключается в том, что она значительно упрощает модульное тестирование.

2 голосов
/ 13 мая 2011

IBActions обычно являются общими и могут запускаться любым классом, следовательно, типом id.Если вам нужно привести переменную sender в вашем методе, то, очевидно, вам небезразличен класс sender, поэтому вы должны изменить сигнатуру метода, чтобы отразить это.

0 голосов
/ 13 мая 2011

id - абстрактный тип данных. Если ваш метод может быть вызван из нескольких мест, с помощью другого объекта, с помощью кнопки и т. Д., То вы не всегда можете знать, какой тип объекта отправляет вызов метода. Я думаю, что в основном это соглашение, если вы собираетесь опрашивать отправителя на предмет данных, вы должны знать, на какие методы он может ответить (если нет, вы можете спросить с помощью responsedsToSelector:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...