#swift #types #enums #func
Вопрос:
есть две функции, получающие перечисление из параметра, возможно ли, чтобы эти функции объединяли только одну функцию?
func rushdownSetupListener(event: RushdownListenEvent, handler: @escaping ([Any], SocketAckEmitter) -gt; Void) -gt; UUID? { guard let client = self.client else { return nil } let listenerId = client.on(event.rawValue, callback: handler) return listenerId } func hystoriaSetupListener(event: HystoriaListenEvent,handler: @escaping ([Any], SocketAckEmitter) -gt; Void) -gt; UUID? { guard let client = client else { return nil } let listenerId = client.on(event.rawValue, callback: handler) return listenerId }
Комментарии:
1. Можете ли вы показать, как
RushdownListenEvent
иHystoriaListenEvent
объявляются?2. @Sweeper это просто возвращаемая строка:) вот так
enum HystoriaListenEvent: String { case STATE = "hystoriaState", case PLAY = "hystoriaPlay" }
Ответ №1:
Поскольку оба этих перечисления имеют String
исходную ценность «а», они оба соответствуют RawRepresentable
«где RawValue == String
«. Таким образом, вы можете ввести универсальный тип параметра, ограниченный именно этим:
func setupListenerlt;EventTypegt;(event: EventType, handler: @escaping ([Any], SocketAckEmitter) -gt; Void) -gt; UUID? where EventType: RawRepresentable, EventType.RawValue == String { guard let client = self.client else { return nil } let listenerId = client.on(event.rawValue, callback: handler) return listenerId }
Вы должны быть в состоянии даже упростить тело функции, чтобы просто:
client?.on(event.rawValue, callback: handler)
Комментарии:
1. Спасибо. но мне нужно знать тип функции, но это два перечисления, в вашем коде, я думаю, нет разницы между событием: Строка 🙁
2. Я не совсем понимаю, что вы имеете в виду под этим. Можете ли вы переписать его на лучший английский? Вы хотите переписать две функции в общую функцию, чтобы уменьшить дублирование кода, верно? Вот что
setupListener
делает функция, которую я показал. Вы можете заменить вызовы наrushdownSetupListener
иhystoriaSetupListener
сsetupListener
.3. @blurple «нет разницы между событием: Строка» Что вы имеете в виду? У него есть по крайней мере одно отличие — вызывающий выглядит
setupListener(event: HystoriaListenEvent.STATE) { ... }
скорее как, чемsetupListener(event: HystoriaListenEvent.STATE.rawValue)
. Вы также можете получить тип, проверивEventType.self
(но, похоже, вы все равно не делаете этого в функции…)4. Ответ, который дал вам @Sweeper, подходит для вашего вопроса. Он также прошел лишнюю милю, предложив, как сделать этот функциональный орган еще более лаконичным.
5. @Sweeper Я думаю, что для этого типа есть другие строгие правила, но это был лучший способ. Огромное спасибо. 🙂