[英]Swift extension only when conforming to Class AND protocol
我有两个扩展名为LoginPresenting
和LoginDismissing
协议。 我希望LoginPresenting
扩展仅适用于也实现LoginDismissing
UIViewControllers
。 我正在尝试这样做,但到目前为止还无法计算出语法。
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 的 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 {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.