protocol ManagerDelegate: class {
func manager(_ manager: ManagerProtocol, didDealWith trouble: String) -> Void
}
protocol ManagerProtocol: class {
weak var delegate: ManagerDelegate? { get set }
}
private class Wrapper {
weak var delegate: ManagerDelegate?
static var key = "key";
}
extension ManagerProtocol {
private var wrapper: Wrapper {
if let wrapper = objc_getAssociatedObject(self, &Wrapper.key) as? Wrapper {
return wrapper;
}
let wrapper = Wrapper();
objc_setAssociatedObject(self, &Wrapper.key, wrapper, .OBJC_ASSOCIATION_RETAIN_NONATOMIC);
return wrapper;
}
weak var delegate: ManagerDelegate? {
get {
return self.wrapper.delegate;
}
set {
self.wrapper.delegate = newValue;
}
}
}
class Manager: ManagerProtocol {
func deal(with trouble: String) -> Void {
print("2. Manager is dealing `(trouble)` ")
DispatchQueue.main.async {
self.delegate?.manager(self, didDealWith: trouble);
print("4. Manager did notice `(self.delegate)` that the `(trouble)` had been dealed.");
}
}
}
protocol SubManagerDelegate: ManagerDelegate {
}
class SubManager: Manager {
weak var delegate: SubManagerDelegate?
}
class ViewController: UIViewController, SubManagerDelegate {
let manager = SubManager();
override func viewDidLoad() {
super.viewDidLoad()
self.manager.delegate = self;
self.get(trouble: "trouble");
}
func get(trouble: String) -> Void {
print("1. Controller get a `(trouble)`.");
self.manager.deal(with: trouble);
print("3. Controller did send the `(trouble)` to Manager whose delegate is `(self.manager.delegate)`");
}
func manager(_ manager: ManagerProtocol, didDealWith trouble: String) {
print("5. Controller did recevie Manager's message that the `(trouble)` had been dealed.");
}
}
记录的控制台:
1. Controller get a `trouble`.
2. Manager is dealing `trouble`
3. Controller did send the `trouble` to Manager whose delegate is `Optional(<SwiftTest.ViewController: 0x7f9abcc03590>)`
4. Manager did notice `nil` that the `trouble` had been dealed.
log 3表示经理的委托是exsits,但
log 4指示(在func deal(with trouble: String) -> Void
中调度)经理的委托为零,而委托方法未调用。
Submanager的实例对象manager
,func deal(with trouble: String) -> Void
中的self
只是manager
,但是为什么它无法获得其delegate
值。
我认为方法func deal(with trouble: String) -> Void
和SubManager
中实现中的self.delegate
在编译时间中可能有所不同。
在Objective-C
代码中,无论何时何地都调用self.delegate
,首先要派出子类的实现。()
这是Swift的错误?
,因为您有一个默认实现,该实现返回委托var的nil。删除无用的扩展协议。