gpt4 book ai didi

swift - 如何模式匹配符合协议(protocol)的类型

转载 作者:可可西里 更新时间:2023-11-01 02:18:13 26 4
gpt4 key购买 nike

我想编写与这样的类型模式匹配的函数(只是示例代码):

protocol Event {}

enum LightsEvent: Event {
case SwitchOn
case SwitchOff
}

enum CameraEvent: Event {
case Rolling
case Cut
}

struct EventHandler {
let event: Event

func handle(event: LightsEvent) {
// do something with lights
}

func handle(event: CameraEvent) {
// do something with camera
}
}

let handler = EventHandler(event: LightsEvent.SwitchOn)
handler.handle(handler.event) // error: Cannot invoke 'handle' with type ('Event')

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

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

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

最佳答案

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

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)

然而,这仍然不够优雅,因为我们在构造 EventHandler 和调用 handle 方法时传递了两次相同的事件。

您也可以不在 EventHandler 中保留对事件的引用,因为可能不需要它,而只是请求处理它:

struct EventHandler {

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

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

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

关于swift - 如何模式匹配符合协议(protocol)的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34511693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com