我有一个类需要在其属性改变时调用委托。以下是委托的简化类和协议:
protocol MyClassDelegate: class {
func valueChanged(myClass: MyClass)
}
class MyClass {
weak var delegate: MyClassDelegate?
var currentValue: Int {
didSet {
if let actualDelegate = delegate {
actualDelegate.valueChanged(self)
}
}
}
init(initialValue: Int) {
currentValue = initialValue
}
}
这一切都很顺利。但是,我想让这个类变成通用的。所以,我尝试了这个:
protocol MyClassDelegate: class {
func valueChanged(genericClass: MyClass)
}
class MyClass<T> {
weak var delegate: MyClassDelegate?
var currentValue: T {
didSet {
if let actualDelegate = delegate {
actualDelegate.valueChanged(self)
}
}
}
init(initialValue: T) {
currentValue = initialValue
}
}
这会产生两个编译器错误。首先,在协议中声明
valueChanged
的行会给出:引用泛型类型'MyClass'需要在<...>中指定参数
。其次,在didSet
观察器中调用valueChanged
会抛出:'MyClassDelegate'没有名为'valueChanged'的成员
。我认为使用
typealias
可以解决问题:protocol MyClassDelegate: class {
typealias MyClassValueType
func valueChanged(genericClass: MyClass<MyClassValueType>)
}
class MyClass<T> {
weak var delegate: MyClassDelegate?
var currentValue: T {
didSet {
if let actualDelegate = delegate {
actualDelegate.valueChanged(self)
}
}
}
init(initialValue: T) {
currentValue = initialValue
}
}
我似乎走在正确的道路上,但我仍然有两个编译器错误。上面的第二个错误仍然存在,并且在声明
MyClass
的 delegate
属性的行上出现了一个新错误:协议'MyClassDelegate'只能用作泛型约束,因为它具有Self或关联类型要求
。有没有办法解决这个问题?
valueChanged
在上述代码中是在currentValue
的didSet
观察器中被调用的。 - GarlicFries