【发布时间】:2015-09-07 17:31:22
【问题描述】:
我想实现观察者模式,但在 Swift(也是 2.0)中找不到合适的编程语言结构。主要问题是:
-
protocol和extension不允许存储属性。 - 我们可以在类中添加存储属性,但不能强制子类覆盖其继承的某些方法。
这就是我想要的:
{class|protocol|extension|whathaveyou} Sensor {
var observers = Array<Any>() // This is not possible in protocol and extensions
// The following is does not work in classes
func switchOn()
func switchOff()
var isRunning : Bool {
get
}
}
class LightSensor : Sensor {
//...
override func switchOn() {
// turn the sensor on
}
}
// In the class C, implementing the protocol 'ObserverProtocol'
var lightSensor = LightSensor()
lightSensor.switchOn()
lightSensor.registerObserver(self) // This is what I want
据我所知,这是可能的:
class Sensor {
private var observers = Array<Observer>()
func registerObserver(observer:ObserverDelegate) {
observers.append(observer)
}
}
protocol SensorProtocol {
func switchOn()
func switchOff()
var isRunning : Bool {
get
}
}
class LightSensor : Sensor, SensorProtocol {
func switchOn() {
//
}
func switchOff() {
//
}
var isRunning : Bool {
get {
return // whatever
}
}
}
但这不是很方便,因为Sensor 和SensorProtocol 应该齐头并进,并且都是子类LightSensor 必须满足的要求。
有什么想法吗?
【问题讨论】:
-
这可能是不可能的,因为你不能在扩展中创建变量,对吧?就我而言,这适用于普通课程
-
是的,但正如我所写,在一个类中我不能强制执行需要实现的方法!
-
我更新了演示代码,明确我想要什么,什么不可能。
-
您可能会注意到 CocoaTouch 已经有一个基于
NSNotification和NSNotificationCenter类的观察者模式。基本上,观察员注册是集中的。没有分散到观察到的类。 -
这个库似乎有一些优点,至少在决定你自己的实现时值得一试:github.com/slazyk/Observable-Swift
标签: swift interface observer-pattern