Отказ от ответственности: это Swift
версия о том, как создать delegate
.
Итак, что такое делегаты? … В разработке программного обеспечения существуют общие многократно используемые архитектуры решений, которые помогают решать часто возникающие проблемы в данном контексте, эти «шаблоны», так сказать, наиболее известны как шаблоны проектирования.
Делегаты - это шаблон проектирования, который позволяет одному объекту отправлять сообщения другому объекту, когда происходит определенное событие.
Представьте, что объект A вызывает объект B для выполнения действия. Как только действие завершено, объект A должен знать, что B выполнил задачу, и предпринять необходимые действия, это может быть достигнуто с помощью делегатов!
Для лучшего объяснения я собираюсь показать вам, как создать пользовательский делегат, который передает данные между классами, с помощью Swift в простом приложении . Начните с загрузки или клонирования этого начального проекта и запустите его!
Вы можете увидеть приложение с двумя классами, ViewController A
и ViewController B
. У Б есть два представления, что при нажатии меняет цвет фона ViewController
, ничего слишком сложного, верно? ну что ж, давайте теперь по-простому подумаем, как изменить цвет фона класса A при касании представлений класса B.
Проблема заключается в том, что эти представления являются частью класса B и не имеют представления о классе A, поэтому нам нужно найти способ связи между этими двумя классами, и именно здесь сияет делегирование.
Я разделил реализацию на 6 шагов, чтобы вы могли использовать ее как шпаргалку, когда вам это нужно.
шаг 1: найдите прагматический знак шага 1 в файле ClassBVC и добавьте это
//MARK: step 1 Add Protocol here.
protocol ClassBVCDelegate: class {
func changeBackgroundColor(_ color: UIColor?)
}
Первым шагом является создание protocol
, в этом случае мы создадим протокол в классе B, внутри протокола вы можете создать столько функций, сколько вам нужно, исходя из требований вашей реализации. В этом случае у нас есть только одна простая функция, которая принимает необязательный UIColor
в качестве аргумента.
Рекомендуется называть ваши протоколы, добавляя слово delegate
в конце имени класса, в данном случае ClassBVCDelegate
.
шаг 2: найдите прагматический знак шага 2 в ClassVBC
и добавьте это
//MARK: step 2 Create a delegate property here.
weak var delegate: ClassBVCDelegate?
Здесь мы просто создаем свойство делегата для класса, это свойство должно принимать тип protocol
, и оно должно быть необязательным. Кроме того, перед свойством необходимо добавить слабое ключевое слово, чтобы избежать циклов и возможных утечек памяти. Если вы пока не знаете, что это значит, не беспокойтесь, просто не забудьте добавить это ключевое слово.
шаг 3: найдите прагматический знак шага 3 внутри handleTap method
в ClassBVC
и добавьте
//MARK: step 3 Add the delegate method call here.
delegate?.changeBackgroundColor(tapGesture.view?.backgroundColor)
Одна вещь, которую вы должны знать, запустите приложение и нажмите на любое представление, вы не увидите никакого нового поведения, и это правильно, но я хочу отметить, что приложение не падает, когда делегат вызвано, и это потому, что мы создаем его как необязательное значение, и поэтому оно не будет падать, даже если делегированный еще не существует. Давайте теперь перейдем к файлу ClassAVC
и сделаем его делегированным.
шаг 4: найдите прагматический знак шага 4 внутри метода handleTap в ClassAVC
и добавьте его рядом с вашим типом класса следующим образом.
//MARK: step 4 conform the protocol here.
class ClassAVC: UIViewController, ClassBVCDelegate {
}
Теперь ClassAVC принял протокол ClassBVCDelegate
, вы можете видеть, что ваш компилятор выдает ошибку, которая говорит: «Тип» ClassAVC не соответствует протоколу «ClassBVCDelegate», и это только означает, что вы не использовали методы пока протокол, представьте, что когда класс A принимает протокол, это все равно что подписывать контракт с классом B, и этот контракт гласит: «Любой принимающий меня класс ДОЛЖЕН использовать мои функции!»
Краткое примечание: Если вы пришли из Objective-C
фона, вы, вероятно, думаете, что вы также можете закрыть эту ошибку, делая этот метод необязательным, но, к моему удивлению, и, вероятно, вашему, Swift
язык не поддерживает необязательный protocols
, если вы хотите сделать это, вы можете создать расширение для protocol
или использовать ключевое слово @objc в вашей реализации protocol
.
Лично, если мне нужно создать протocol с другими необязательными методами. Я бы предпочел разбить его на разные protocols
, поэтому я буду следовать концепции предоставления единой ответственности за мои объекты, но она может варьироваться в зависимости от конкретной реализации.
вот хорошая статья о дополнительных методах.
шаг 5: найдите прагматический знак шага 5 внутри метода подготовки к переходу и добавьте это
//MARK: step 5 create a reference of Class B and bind them through the `prepareforsegue` method.
if let nav = segue.destination as? UINavigationController, let classBVC = nav.topViewController as? ClassBVC {
classBVC.delegate = self
}
Здесь мы просто создаем экземпляр ClassBVC
и назначаем его делегата для себя, но что здесь есть я? что ж, "я" - это ClassAVC
, которое было делегировано!
шаг 6: Наконец, найдите прагму шага 6 в ClassAVC
и давайте воспользуемся функциями protocol
, начнем вводить func changeBackgroundColor , и вы увидите, что он автоматически заполняется для вы. Вы можете добавить любую реализацию внутри него, в этом примере мы просто изменим цвет фона, добавим это.
//MARK: step 6 finally use the method of the contract
func changeBackgroundColor(_ color: UIColor?) {
view.backgroundColor = color
}
Теперь запустите приложение!
Delegates
есть везде, и вы, вероятно, используете их даже без уведомления, если вы создали tableview
в прошлом, вы использовали делегирование, многие классы UIKIT
работают вокруг них и многие другие frameworks
также решают эти основные проблемы.
- Избегайте плотного сцепления предметов.
- Изменение поведения и внешнего вида без необходимости создавать подклассы объектов.
- Разрешить выполнение задач любому произвольному объекту.
Поздравляю, вы просто внедрили собственный делегат, я знаю, что вы, вероятно, думаете, так много проблем только для этого? Ну, делегирование - это очень важный шаблон проектирования, который нужно понимать, если вы хотите стать iOS
разработчиком, и всегда помнить, что они имеют отношение один к одному между объектами.
Вы можете увидеть оригинальное руководство здесь