Как Apple диктует, какие классы должны быть разбиты на интерфейс протокола для класса? - PullRequest
0 голосов
/ 08 мая 2018

Я постоянно размышляю над тем, что именно означает термин «делегат», создавая многочисленные приложения с использованием UITableView и NSSpeechSynthesizer. Я прочитал несколько полезных блогов и книг, так что, похоже, все сводится к тому, чтобы быть шаблоном дизайна, который выполняет единственную ответственность или разделение интересов (или, по крайней мере, таково мое мнение). У меня такой вопрос: кто-нибудь знает, с какой целью Apple решает использовать состав делегатов для классов?

1 Ответ

0 голосов
/ 08 мая 2018

Забудьте о шаблонах дизайна. Если есть шаблон проектирования, то это «шаблон проектирования делегата».

UITableView может отображать данные различными способами. И данные могут поступать из миллиарда разных мест. UITableView не может справиться со всем этим.

Именно поэтому приложение предоставляет один делегат объект, который предоставляет данные для UITableView. Делегат должен иметь возможность сообщить UITableView, сколько разделов в таблице, сколько строк в каждом разделе, данные для каждой строки, верхний и нижний колонтитулы для каждого раздела. Обладая этими знаниями, UITableView может выполнять свою работу. Без этого делегата вам пришлось бы создавать множество подклассов UITableView, что является проблемой.

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

Итак, как работает шаблон делегата: вы создаете класс, который выполняет эту тяжелую работу. Но для того, чтобы класс мог адаптироваться к различным ситуациям, вы предоставляете ему объект делегата, который реализует различия между различными ситуациями. Объект делегата обычно является экземпляром полностью несвязанного класса, к которому были добавлены методы делегата.

...