我真的很喜欢Sulthan的回答(在Anonymous class in swift) 它描述了建立一个符合协议,但其类隐藏在闭包中的对象。这将是很好的建设单身人士,并没有污染的名称空间与类像Recorder1,Recorder2 ...为什么不能关闭实例成员
然而,当我尝试做任何有用的事情,我失败了,因为封闭不会关闭外类内部类的实例成员。
protocol EventListener {
func handleEvent(event: Int) ->()
}
class Recorder {
static var events = [Int]() // static is forced
var listener: EventListener = {
class R : EventListener {
func handleEvent(event: Int) {
events.append(event)
print("Recorded: \(event)")
}
}//
return R()
}()
}// Recorder
class Distributor {
var listeners = [EventListener]()
func register(listener: EventListener){
listeners.append(listener)
}
func distribute(event: Int){
for listener in listeners {
listener.handleEvent(event)
}
}
}
var d = Distributor()
var r1 = Recorder()
var r2 = Recorder()
d.register(r1.listener)
d.register(r2.listener)
d.distribute(10)
print(Recorder.events) // [10, 10] Same event recorded twice.
以上编译和运行。但我希望 Recorder
成为一个实例成员,以便每个记录器都有自己的记录。删除static
会抛出编译器错误:实例成员'events'不能使用。
我试着在Recorder中为handleEvent(event)
定义一个实例func record(event)
来调用,但是我得到了同样的错误。
Marius的回答(在Instance member cannot be used on type | Closures)建议你不能在定义属性的时候访问实例成员,所以我也试图在后面计算这个监听器。
class Recorder {
var events = [Int]()
var listener: EventListener {
class R : EventListener {
func handleEvent(event: Int) {
events.append(event) // error: can't access events
print("Recorded: \(event)")
}
}
return R()
}
}// Recorder
但是编译器说,它无法访问的外自我。
如果他们无法访问外部自我,闭包看起来很无能。在Java中,你可以使用类似Recorder.self.events
的东西来获得外部自我。而Recorder.self.
可能只有当有名称冲突时才需要(?)
斯威夫特是这样设计的还是我错过了什么?
你会如何编写它,所以Recorder
给Distributor
一个对象,除了接收handleEvent消息什么都不能做?
非常感谢。
谢谢你看这个!让我熬一会儿吧。 – adazacom