假设我的课程非常简单: class BoxT { var boxedObject:T init(object: T) { self.boxedObject = object }} 我现在想要实现的是添加委托,它可以告诉我框中的值已经改变: protocol BoxDelegateT: class { func valueI
class Box<T> {
var boxedObject:T
init(object: T) {
self.boxedObject = object
}
}
我现在想要实现的是添加委托,它可以告诉我框中的值已经改变:
protocol BoxDelegate<T>: class {
func valueInBoxChanged(box: Box<T>) -> Void
}
class Box<T> {
var boxedObject: T {
didSet {
self.delegate?.valueInBoxChanged(self)
}
}
weak var delegate: BoxDelegate<T>?
init(object: T) {
self.boxedObject = object
}
}
此代码当然不起作用,因为我们没有通用委托.我可以使委托成为一个带闭包的结构,但它有点难看的解决方案.我应该如何在Swift中做这些事情?
由于使用Swift的类型约束协议,您可能无法执行上面尝试执行的操作.你可以做的是在设置委托时创建一个闭包并稍后调用闭包.这将使您的案例在某种程度上更简单,
protocol BoxDelegate: class {
associatedtype T
func valueInBoxChanged(box: Box<T>) -> Void
}
class Box<T> {
var notifyClosure: (Void -> Void)?
var boxedObject: T {
didSet {
self.notifyClosure?()
}
}
func setBoxDelegate<M where M:BoxDelegate, M.T == T>(delegate: M) {
notifyClosure = {
delegate.valueInBoxChanged(self)
}
}
init(object: T) {
self.boxedObject = object
}
}
因此,您不需要添加带有闭包的额外结构来使其工作.相反,您不会为BoxDelegate创建属性,而是创建一个方法来设置它并基于此创建一个闭包对象.
