Swift 如何对符合协议的类型进行模式匹配

Swift 如何对符合协议的类型进行模式匹配,swift,pattern-matching,protocols,Swift,Pattern Matching,Protocols,我想编写与以下类型模式匹配的函数(仅示例代码): 我觉得它应该编译,但它没有。这迫使我添加一个开关函数,如下所示: func handle(event: Event) { switch event { case let e as LightsEvent: handle(e) case let e as CameraEvent: handle(e) default: fatalError() } } 但我不想

我想编写与以下类型模式匹配的函数(仅示例代码):

我觉得它应该编译,但它没有。这迫使我添加一个开关函数,如下所示:

func handle(event: Event) {
        switch event {
        case let e as LightsEvent: handle(e)
        case let e as CameraEvent: handle(e)
        default: fatalError()
        }
    }

但我不想每次向处理程序添加另一种类型的事件时都向这个开关添加另一个案例。有人知道如何更优雅地解决这个问题吗?

将泛型添加到
EventHandler
将使其工作:

protocol Event {}

enum Events : Event {
    case One, Two
}

struct EventHandler {
    let event: Events

    func handle<T: Event>(event: T) {
        print(event)
    }
}

let handler = EventHandler(event: Events.Two)
handler.handle(handler.event) // prints "Two"
struct EventHandler<T: Event> {
    let event: T

    func handle(event: LightsEvent) {
        print("lights: \(event)");
    }

    func handle(event: CameraEvent) {
        print("camera: \(event)");
    }
}

let handler = EventHandler(event: LightsEvent.SwitchOn)
handler.handle(handler.event)

如果目标是优雅,那么改变你的枚举,它们一开始就不优雅。@luk2302实际上,你会惊讶地发现,通过使用枚举(带或不带关联值)和模式匹配,你可以多么优雅地解决
Swift
中的问题。我编辑了我的问题,让它更清楚我想要什么。我希望能够通过顶级事件管理器发送不同类型的事件。
enum Events {
    case One, Two
}

struct EventHandler {
    let event: Events

    func handle(event: Events) {
        print(event)
    }
}

let handler = EventHandler(event: Events.Two)
handler.handle(handler.event) // prints "Two"
struct EventHandler<T: Event> {
    let event: T

    func handle(event: LightsEvent) {
        print("lights: \(event)");
    }

    func handle(event: CameraEvent) {
        print("camera: \(event)");
    }
}

let handler = EventHandler(event: LightsEvent.SwitchOn)
handler.handle(handler.event)
struct EventHandler {

    func handle(event: LightsEvent) {
        print("lights: \(event)");
    }

    func handle(event: CameraEvent) {
        print("camera: \(event)");
    }
}

let handler = EventHandler()
handler.handle(LightsEvent.SwitchOn)