【发布时间】:2015-09-23 02:13:03
【问题描述】:
使用 Swift 2 的类型化枚举功能,我可以定义一些 事件,这些事件可以被我的应用广播和收听。这样做我可以让编译器为我检查,我也不必提供字符串。
protocol Event: RawRepresentable {}
// Somewhere in a view
enum SettingsEvent: String, Event {
case Bar
case Baz
}
// Somewhere else in the app
enum ViewEvents: String, Event {
case Foo
case Bar
}
可以广播事件,这就是执行此操作的函数。 我需要使用两种泛型类型,因为:
- 协议“事件”只能用作通用约束,因为它具有 Self 或关联的类型要求
- V 被传递给我控制的另一个通用集合
func broadcastEvent<E: Event, V: AnyObject>(event: E, withValue value: V? = nil) {
// Do something with event and value. This is not the real function body
print(event.rawValue)
if let v = value {
print(v)
}
}
现在,这个调用起作用了:
broadcastEvent(SettingsEvent.Baz, withValue: "aa")
虽然这些不起作用
broadcastEvent(SettingsEvent.Baz)
broadcastEvent(SettingsEvent.Baz, withValue: nil)
编译器说:
错误:无法使用类型为“(SettingsEvent, withValue: NilLiteralConvertible)”的参数列表调用“broadcastEvent”
注意:需要一个类型为 '(E, withValue: V?)'的参数列表
这是怎么回事?
【问题讨论】:
标签: swift