【问题标题】:is it possible swift func get <T> enum?是否有可能 swift func 获取 <T> 枚举?
【发布时间】:2021-12-27 07:54:57
【问题描述】:

有两个函数从参数中获取枚举, 有没有可能这些功能只结合了一个功能?

func rushdownSetupListener(event: RushdownListenEvent, handler: @escaping ([Any], SocketAckEmitter) -> Void) -> 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) -> Void) -> UUID? {
        guard let client = client else {
            return nil
        }
        let listenerId = client.on(event.rawValue, callback: handler)
        
        return listenerId
    }

【问题讨论】:

  • 你能说明RushdownListenEventHystoriaListenEvent是如何声明的吗?
  • @Sweeper 它只是返回字符串:) 像这样enum HystoriaListenEvent: String { case STATE = "hystoriaState", case PLAY = "hystoriaPlay" }

标签: swift types enums func


【解决方案1】:

由于这两个枚举都具有String 作为其原始值,因此它们都符合RawRepresentable 其中RawValue == String。因此,您可以引入一个泛型参数类型,限制为:

func setupListener<EventType>(event: EventType, handler: @escaping ([Any], SocketAckEmitter) -> Void) -> 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)

【讨论】:

  • 谢谢。但我需要的是 func 知道类型,但它有两个枚举,在你的代码中,我认为 event: String :(
  • 我不确定你的意思。你能把它改写成更好的英语吗?您想将这两个函数重写为一个通用函数以减少代码重复,对吗?这就是我展示的setupListener 函数的作用。您可以将对rushdownSetupListenerhystoriaSetupListener 的调用替换为setupListener
  • @blurple“事件之间没有区别:字符串”你是什么意思?它至少有一个区别——调用者看起来像setupListener(event: HystoriaListenEvent.STATE) { ... } 而不是setupListener(event: HystoriaListenEvent.STATE.rawValue)。您还可以通过检查EventType.self 来获取类型(但您似乎并没有在函数中这样做......)
  • @Sweeper 给您的答案是适合您的问题的答案。他还提出了如何使该函数体更加简洁的建议。
  • @Sweeper 我认为该类型还有其他严格要求,但这是最好的方法。太感谢了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多