2015-12-25 3 views
0

Я пришел из C# фона, правильно ли сказать, что делегаты (а не версия C#) в Swift в основном такие же, как интерфейсы в C#?Делегаты в Swift, они нам нужны?

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

Вопрос в том, нельзя ли просто добавить функцию в класс swift, а затем подкласс класса просмотра, классифицированный из этого? Как

функ ShowName (имя: String)

И есть Первый вызов вида контроллера второго контроллер с помощью этой функции (то есть в классе, что второй контроллер наследника).

+0

Обратите внимание, что Swift не допускает множественное наследование, поэтому субклассификация обычно используется только для классов UIKit/Foundation подкласса. Приступая к форме C#, вы используете ориентированное на объект программирование, ООП, тогда как в быстрых (помимо функциональных возможностей) мы используем слабо ориентированное по протоколу программирование. Что касается интерфейсов и делегатов: я бы сказал, что Swift для интерфейсов - это * протоколы *, а сами протоколы часто используются для предоставления обратных вызовов делегатов между различными контроллерами/моделями. Однако протоколы также широко используются в приложениях, не являющихся делегатами. – dfri

ответ

0

Вы должны делегаты

Независимо от того, если вы создаете некоторые из ваших собственных, вы не получите вокруг их использования - они везде встроенные.

И да, вы могли бы просто определить функцию в viewController и вызвать ее, но тогда вызывающий объект этого метода должен теперь иметь дело с viewController, и ничего ему не очень-то нужно. Все, о чем он заботится, это тот факт, что есть/должна быть функция под названием showName.

Если вы собираетесь передавать данные вперед, вам не обязательно использовать делегирование, поскольку вы знаете, куда будете передавать данные. Но если вы хотите передать данные назад, вы обычно не знаете, откуда пришли ->second controller не знает и должен не знал, что он был представлен first view controller. Он должен работать одинаково, независимо от того, где он был представлен. И тот, кто чувствует ответственность за него, может и должен назначать себя делегатом, который получает информацию об изменениях или обратных вызовах или что-то еще.

Подклассификация, о которой вы упоминаете, в основном такова, но вы можете только подкласс один раз, поэтому, если вы хотите, чтобы ваш класс был делегатом для TableView, CollectionView и вашего CustomView, у вас будет плохое время с только подклассом , То, что вам нужно будет использовать, - это делегирование через protocols

+0

«Но если вы хотите передать данные назад, вы обычно не знаете, откуда пришли -> второй контроллер не знает и не должен знать, что он был представлен контроллером первого взгляда». Хорошая точка зрения.... – SirPaulMuaddib

1

Технически это Swift protocols, которые аналогичны интерфейсам C#. Протокол фактически является контрактом того, какие методы/свойства реализует класс. Как и интерфейсы C#, он может использоваться в шаблонах делегирования, но также имеет гораздо более широкие приложения.

Но протоколы служат центральную функцию шаблонов делегирования (см Delegation обсуждения в Свифте Язык или Protocol или Delegation обсуждения в какао ключевых компетенций), в которых объект может назначить другой объект, с которым он будет взаимодействовать , Протокол просто описывает точный характер того, что объект требует от своего объекта-делегата, а также какие дополнительные интерфейсы он поддерживает с его делегатом.

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

Хотя для реализации протокола может потребоваться больше двух-трех минут, это почти всегда стоит усилий. Это упростит ваше обслуживание этих классов в будущем.Поэтому, пока вам не требуется технически использовать протоколы для ваших делегатов и/или обмениваться информацией между объектами, я думаю, вы поблагодарите себя, если вы это сделаете.

Смежные вопросы