【发布时间】:2015-02-19 19:18:49
【问题描述】:
我有一个类需要在其属性之一更改时调用委托。以下是委托的简化类和协议:
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 的行给出:Reference to generic type 'MyClass' requires arguments in <...>。其次,在didSet 观察者中对valueChanged 的调用会抛出:'MyClassDelegate' does not have a member named '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 属性的行上的一个新错误:Protocol 'MyClassDelegate' can only be used as a generic constraint because it has Self or associated type requirements。
有没有办法做到这一点?
【问题讨论】: