Быстрое расширение только при условии соответствия классу и протоколу - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть два протокола с расширениями LoginPresenting и LoginDismissing. Я хочу, чтобы расширение 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 применимым только к UIViewControllers, которые также реализуют LoginDismissing.

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)
    }
}

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Вы можете устранить синтаксическую ошибку, используя & вместо запятой:

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

Это расширение распространяется только на контроллеры представления, которые также соответствуют LoginDismissing.

1 голос
/ 28 февраля 2020

Вы должны применять как можно больше требований к самому протоколу, а не к расширениям.

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

Кроме того, class является старым синтаксисом, но не считается устаревшим.

protocol LoginDismissing: AnyObject {
...