协议和子类在迅速中,自我并不意味着当前对象


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的实例对象managerfunc deal(with trouble: String) -> Void中的self只是manager,但是为什么它无法获得其delegate值。

我认为方法func deal(with trouble: String) -> VoidSubManager中实现中的self.delegate在编译时间中可能有所不同。

Objective-C代码中,无论何时何地都调用self.delegate,首先要派出子类的实现。()

这是Swift的错误?

,因为您有一个默认实现,该实现返回委托var的nil。删除无用的扩展协议。

相关内容

最新更新