возможно ли, чтобы функция swift получала перечисление ?

#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 Я думаю, что для этого типа есть другие строгие правила, но это был лучший способ. Огромное спасибо. 🙂