Итак, я делаю игру SpriteKit и хочу пересылать события update
, mouseDown
, keyDown
и т. д., которые вызываются в GameScene
, дочерним элементам этой сцены, при условии, что они являются пользовательским подклассом SKNode, который имеет соответствующий ответчики.
Я сделал несколько протоколов в зависимости от того, какие функции я хочу вызывать на каждом узле, например, у меня есть KeyboardDelegate
для узлов, которые должны получать keyDown
, keyUp
и т. д.... UpdateDelegate
для update
, didSimulatePhysics
и т. д.... и что-то в этом роде для каждый тип вызовов в сумме у меня есть UpdateDelegate
, KeyboardDelegate
, MouseDelegate
и CollisionDelegate
каждый для соответствующего типа вызовов.
И так в GameScene
I есть такие функции как:
func someEvent(someParameter: ArgumentType) {
for child in children where child is SomeProtocol {
//onSomeEvent should be required by SomeProtocol
(child as! SomeProtocol).onSomeEvent(someParameter)
}
}
Проблема в том, что есть около 20 таких событий, которые я хочу переслать, и у меня есть один и тот же код в каждой функции, единственная часть, которая отличается, это SomeProtocol
и onSomeEvent
.
Я попытался создать функцию, которая обрабатывает все это, поэтому мне не нужно писать этот код для каждого события, которое я хочу переслать, вот так:
extension SKNode {
func forward<T>(method: Selector, onChildrenOfType: T.Type, withArgument argument: AnyObject) {
for child in children where child is T {
child.performSelector(method, withObject: first)
}
}
}
Расширение было на SKNode, поэтому я мог перенаправлять вызовы на каждого дочернего узла каждого отдельного узла, получающего вызов, независимо от того, какой тип SKNode они были.
Сама функция казалась не совсем правильной, и не потому, что она не работала, я не мог передать протокол напрямую, не используя SomeProtocol.self
, и всякий раз, когда я вызывал ее так:
override func someEvent(someParameter: ArgumentType) {
self.recurse(#selector(onSomeEvent(_:)), onChildrenOfType: SomeProtocol.self, withArgument: someParameter)
}
Я бы получил use of unresolved identifier 'onSomeEvent'
, я полагаю, потому что компилятор не знает, где искать функцию onSomeEvent
.
Итак... есть ли способ заставить эту работу (помимо, вероятно, использования старого синтаксиса селектора) предпочтительно, если я могу передать более 2 параметров (поскольку PerformSelector просто допускает до 2, а objc_msgSend
и NSInvocation
недоступны), или должен Я просто копирую код в каждом событии, которое хочу переслать.