Я много исследовал, что означает делегат, но почему-то мое понимание не согласуется с этим объяснением. Это из учебника:
physicsWorld.contactDelegate = self
И вот его объяснение: «Это настраивает мир физики, чтобы не было гравитации, и настраивает сцену как делегат, который будет уведомлен, когда два физических тела сталкиваются. »
Я думал, что делегат - это просто класс, использующий протокол. Есть ли у кого-нибудь другое объяснение этому? что именно делает эта линия? Спасибо. (игнорируйте гравитационную часть, есть еще одна строка кода)
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, это указатель на функцию)
Это помогло мне понять делегатов, когда я впервые пришел через них.
Делегат - это протокол, также иногда называемый «протокол делегата». Класс, содержащий строку кода в кавычках, становится делегатом и получает сообщения соответствующего протокола . physicsWorld
свяжется со своим делегатом, чтобы сообщить ему о столкновении. Если методы делегата реализованы (т.е. контроллер соответствует протоколу делегата), он может предпринять соответствующие действия при получении уведомления.
Ясно?
Похожие вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.