Я много исследовал, что означает делегат, но почему-то мое понимание не согласуется с этим объяснением. Это из учебника:

    physicsWorld.contactDelegate = self

И вот его объяснение: «Это настраивает мир физики, чтобы не было гравитации, и настраивает сцену как делегат, который будет уведомлен, когда два физических тела сталкиваются. »

Я думал, что делегат - это просто класс, использующий протокол. Есть ли у кого-нибудь другое объяснение этому? что именно делает эта линия? Спасибо. (игнорируйте гравитационную часть, есть еще одна строка кода)

1
user3758745 21 Мар 2015 в 06:18

2 ответа

Лучший ответ

Согласно документации Swift для PhysicsWorld class:

свойство contactDelegate

Делегат, который вызывается, когда два физических тела контактируют друг с другом.

Поэтому, когда мы видим строку:

physicsWorld.contactDelegate = self

Мы устанавливаем свойство contactDelegate в экземпляре PhysicsWorld, чтобы при столкновении двух физических объектов вызывался какой-то метод, то есть делегат.

Назначая self, мы делегируем ответственность за реагирование на столкновения физических объектов классу (GameScene).

override func didMoveToView(view: SKView)

Поскольку мы переопределяем этот метод в классе GameScene, который наследуется от класса SKScene, мы, по сути, говорим:

«Не используйте SKScene didMoveToView(), используйте эту версию GameScene didMoveToView()» (поскольку self относится к классу GameScene).

Значит, функция didBeginContact () является делегатом? а contactDelegate всегда должен быть классом, который будет реализовывать функцию didBeginContact () (или любую другую функцию из протокола делегата)?

Я предполагаю, что метод didBeginContact () вызывает метод, для которого установлено свойство contactDelegate.

У Java нет делегатов. Делегат похож на переменную, за исключением того, что он хранит метод. Затем вы можете использовать переменную для вызова метода. (Если вы знаете какой-то C, это указатель на функцию)

Это помогло мне понять делегатов, когда я впервые пришел через них.

0
23 Мар 2015 в 23:35
Я полагаю, это слово «делегат» меня задевает. Я действительно ненавижу соглашение об именах Swift, особенно для методов. Значит, функция didBeginContact () является делегатом? а contactDelegate всегда должен быть классом, который будет реализовывать функцию didBeginContact () (или любую другую функцию из протокола делегата)? и, наконец, есть ли эквивалентное слово для делегата в Java или любых языках семейства C?
 – 
user3758745
23 Мар 2015 в 05:08

Делегат - это протокол, также иногда называемый «протокол делегата». Класс, содержащий строку кода в кавычках, становится делегатом и получает сообщения соответствующего протокола . physicsWorld свяжется со своим делегатом, чтобы сообщить ему о столкновении. Если методы делегата реализованы (т.е. контроллер соответствует протоколу делегата), он может предпринять соответствующие действия при получении уведомления.

Ясно?

0
Mundi 21 Мар 2015 в 06:35