Swift 仅在符合 Class AND 协议时扩展
Swift extension only when conforming to Class AND protocol
我有两个扩展名为 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 仅适用于也实现了 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 {
我有两个扩展名为 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 仅适用于也实现了 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 {