Node.js 如何在Swift中优雅地实现EventEmitter
我正在编写一个绑定到Swift的Node.js 如何在Swift中优雅地实现EventEmitter,node.js,swift,Node.js,Swift,我正在编写一个绑定到Swift的hiredis,并正在处理异步API部分 我想在Node.js中使用类似于EventEmitter的东西 objectToBeListened.on('event',(data)=>{…}) objectToBeListened.emit('事件') 也就是说,我希望我拥有的每个类只有一个“on”和一个“emit”函数 我目前对所有事件类型使用enum,并在“开启”功能中使用switch。引入了一个额外的struct,用于存储所有回调函数 我无法实现通用的“e
hiredis
,并正在处理异步API部分
我想在Node.js中使用类似于EventEmitter的东西
objectToBeListened.on('event',(data)=>{…})
objectToBeListened.emit('事件')
也就是说,我希望我拥有的每个类只有一个“on”和一个“emit”函数
我目前对所有事件类型使用enum
,并在“开启”功能中使用switch
。引入了一个额外的struct
,用于存储所有回调函数
我无法实现通用的“emit”函数:我只是浏览了一下Swift的泛型部分。但这有可能吗?Swift似乎没有可变模板
无论如何,我的原型代码非常难看,很难维护。有没有更好的方法来优雅地实现EventEmitter
class EEProto {
var A: Int
var B: Double
typealias EventChangeA = (Int, Int) -> Void
typealias EventChangeB = (Double, Double) -> Void
typealias EventChanged = () -> Void
struct RegisteredEvent {
var eventChangeA: EventChangeA[]
var eventChangeB: EventChangeB[]
var eventChanged: EventChanged[]
}
enum EventType {
case changeA(EventChangeA[])
case changeB(EventChangeB[])
case changed(EventChanged[])
}
var registeredEvents: RegisteredEvent
init (A: Int, B: Double) {
self.A = A
self.B = B
registeredEvents = RegisteredEvent(eventChangeA: [], eventChangeB: [], eventChanged: [])
}
func on (event: EventType) {
switch event {
case .changeA(let events):
registeredEvents.eventChangeA += events
case .changeB(let events):
registeredEvents.eventChangeB += events
case .changed(let events):
registeredEvents.eventChanged += events
default:
assert("unhandled event type | check your code")
break
}
}
func resetEvents (eventType: EventType) {
switch eventType {
case .changeA:
registeredEvents.eventChangeA = []
case .changeB:
registeredEvents.eventChangeA = []
case .changed:
registeredEvents.eventChangeA = []
default:
assert("unhandled event type | check your code")
break
}
}
func setA (newA: Int) {
let oldA = A
A = newA
for cb in registeredEvents.eventChangeA {
cb(oldA, newA)
}
for cb in registeredEvents.eventChanged {
cb()
}
}
func setB (newB: Double) {
let oldB = B
B = newB
for cb in registeredEvents.eventChangeB {
cb(oldB, newB)
}
for cb in registeredEvents.eventChanged {
cb()
}
}
}
var inst = EEProto(A: 10, B: 5.5)
inst.on(EEProto.EventType.changeA([{
println("from \($0) to \($1)")
}]))
inst.on(EEProto.EventType.changeB([{
println("from \($0) to \($1)")
}]))
inst.on(EEProto.EventType.changed([{
println("value changed")
}]))
inst.setA(10)
inst.setB(3.14)