我真的很喜歡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