Swift扩展仅在符合Class AND协议的情况下进行



我有两个扩展为LoginPresentingLoginDismissing的协议。我希望LoginPresenting扩展仅适用于同样实现LoginDismissingUIViewControllers。我正试着这样做,但到目前为止还无法找出语法。

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

以下是错误代码,但我认为它解释了我如何试图使LoginPresetting仅适用于同样实现LoginDisking的UIViewControllers。

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 {

相关内容

最新更新