Swift 仅在符合 Class AND 协议时扩展

Swift extension only when conforming to Class AND protocol

我有两个扩展名为 LoginPresentingLoginDismissing 的协议。我希望 LoginPresenting 扩展只适用于 UIViewControllers,它也实现了 LoginDismissing。我正在尝试这样做,但到目前为止还无法计算出语法。

protocol LoginDismissing : class {
    func loginHasCompleted(withController: UIViewController)
}

extension LoginDismissing where Self:UIViewController {
    func loginHasCompleted(withController controller:UIViewController) {
        //...code ommited
    }
}

protocol LoginPresenting : class {
    func presentLogin()
}

以下是错误代码,但我认为它解释了我如何尝试使 LoginPresenting 仅适用于也实现了 LoginDismissing 的 UIViewController。

extension LoginPresenting where Self:UIViewController, LoginDismissing //Syntax error here

    func presentLogin() {
        let lc = LoginViewController()
        let nav = UINavigationController(rootViewController: lc)
        nav.modalPresentationStyle = .fullScreen
        lc.loginDismissingDelegate = self //type LoginDismissing
        self.present(nav, animated: true, completion: nil)
    }
}

您可以使用 & 而不是逗号来解决语法错误:

extension LoginPresenting where Self: UIViewController & LoginDismissing {
    // ...
}

这使得扩展仅适用于也符合 LoginDismissing 的视图控制器。

您应该对协议本身而非扩展执行尽可能多的要求。

protocol LoginPresenting: LoginDismissing & UIViewController {
  func presentLogin()
}

此外,class 是旧语法,但并未弃用。

protocol LoginDismissing: AnyObject {