Наконец-то пришло лето. Вы только что вернулись домой после последнего дня в 6-м классе, и вам не терпится просто лечь в постель и поиграть в Pokemon Ruby, пока у вас не заболеют глаза (или пока вы не разрядите всю эту пачку батареек AA). Еще до того, как вы дойдете до своей комнаты, вы получите сообщение от мамы ...

«Джош, я сегодня работаю допоздна. Не могли бы вы вымыть посуду, убрать свою комнату и прогуляться с Налой, прежде чем я вернусь? »

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

Теперь представьте меня в шестом классе как о классе «Сын», а о моей матери - как о классе «Мама». Класс для мамы в данный момент не хочет выполнять эти обязанности, вероятно, она занята на работе, выполняя другие задачи. Есть шанс, что у нее даже нет материалов, необходимых для выполнения этой работы, но она хочет, чтобы работа была сделана. Так что она делает? Она поручает другому классу, классу Сынов, делать за нее работу по дому.

Вкратце: Swift Delegation - это способ для определенного класса или структуры делегировать задачи другому классу или структуре.

Давайте взглянем…

К вашему сведению, вот небольшое техническое определение, потому что я не буду углубляться в протоколы:

протокол - это набор методов или свойств. При принятии / наследовании эти методы или свойства должны быть реализованы принимающим классом (или структурой, или перечислением). Для тех из вас, кто знаком с Java, он очень похож на интерфейсы Java с некоторыми тонкими нюансами. (Посмотрите их, пока Google все еще бесплатен)

Таким образом, мы видим, что протокол «MomDelegate» - это список дел, которые мы хотим, чтобы наш класс «Mom» делегировал / приказывал выполнять нашему классу «Son».

Я знаю, о чем ты думаешь. «Какого черта, это просто названия функций. На самом деле они ничего не делают ». … пока нет. Это потому, что сначала необходимо реализовать эти функции. А кто будет реализовывать эти функции? Класс «Сын», который на самом деле будет делать работу по дому ...

Вкратце: Относитесь к протоколу MomDelegate как к списку дел в блокноте. Класс «Сын», который будет читать блокнот, будет выполнять эту работу по дому ..

Ранее пустые заголовки функций теперь полностью реализованы. Класс «Сын» теперь может выполнять всю эту работу, поэтому, когда другой класс говорит им, что делать, у них уже есть шаги / код, готовые к выполнению, когда придет время!

Так что все это значит? Чтобы разобраться в этом, давайте взглянем на последний недостающий фрагмент головоломки - урок «Мама».

Здесь следует отметить очень важную вещь:

Класс «Mom» имеет экземпляр класса «Son», но помните: класс «Son» соответствовал протоколу «MomDelegate».

Это означает, что «Сын» способен выполнять эту работу по дому, потому что, реализуя «MomDelegate» , класс «Сын» заверяет любого, что он знает, что делать, когда необходимо выполнить любую из рутинных работ «MomDelegate» .

Он знает, как мыть посуду, как выгуливать собаку, как убирать в своей комнате, он может даже знать другие вещи, которые нас не волнуют, не относящиеся к работе по дому! Но суть в следующем: Соответствуя протоколу «MomDelegate», мы знаем, что класс «Son» может делать все, что указано в этом списке рутинных дел.

Так что же дальше? Мы позволяем нашей «маме» говорить «Сыну» делать эти дела по дому.

Сначала мы создаем экземпляр нашего класса «Son» и устанавливаем константу «josh» как экземпляр класса «Son». Затем мы создаем экземпляр нашего класса Mom и устанавливаем константу joshsMom, передавая наш экземпляр josh в качестве параметра. Это как если бы мы говорили: Джош - сын joshsMom.

Мы должны определить эти отношения, потому что без «joshsMom», владеющего экземпляром «josh», «josh» нельзя сказать, что делать. Представьте, что "joshsMom" кричит в пустой комнате, ожидая, что кто-то помоет посуду. Там никого нет и никто не сделает это за вас. Вроде как сейчас, когда я переехал в Даллас! (Я люблю тебя, мама, я скоро буду в гостях)

Наконец, когда мы говорим «joshsMom.tellJoshWhatToDo ()», мы выполняем всю эту работу в функции «tellJoshWhatToDo ()» через «josh». Эту работу выполняет сам «josh», потому что экземпляр «josh» теперь является переменной «_son» в классе «Mom»!

Здесь действительно здорово то, что «joshsMom» не нужно знать, как «josh» выполняет эти задачи. Она просто должна сказать ему, что делать. делегируя эти обязанности «Джошу», эти задачи могут быть выполнены без выполнения «joshsMom» какой-либо работы / выполнения!

Делегирование - отличный способ разделить вашу функциональность на основе служебной необходимости. Здесь только класс «Сын» умеет выполнять эти задачи. Класс "Мама" не заботится о том, как это делается, до тех пор, пока это делается.

Для вас, разработчики: с помощью делегатов мы можем указывать важные события, которые происходят в одном классе, и реагировать на них в другом. Представьте, что нажата кнопка «Назад» и делегат вызывает функцию onBackButtonPress (), которая сообщает своему навигатору, что нужно открыть текущий контроллер представления.

Контроллер представления не заботится о том, что делает Координатор, он просто сообщает ему, что произошло действие, и Координатор должен действовать в ответ на него.

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

Спасибо за прочтение!