Лично я не думаю, что StartController
должен знать о / соответствовать ExistingEmailControllerDelegate
. Но если вы действительно хотите, вы можете объявить controller
как тип композиции:
static func signInWithFacebook(controller: UIViewController & ExistingEmailControllerDelegate) {
...
authVC.delegate = controller
На мой взгляд, весь смысл наличия AuthManager
состоит в создании слоя абстракции поверх ExistingEmailController
, а инкапсулирует логи c аутентификации. Следовательно, StartController
не должен знать или заботиться о ExistingEmailControllerDelegate
. Он знает только о AuthManager
.
AuthManager
должен быть делегатом ExistingEmailController
, что означает, что signInWithFacebook
не должно быть stati c, а AuthManager
может иметь AuthManagerDelegate
, что StartController
соответствует:
class AuthManager : ExistingEmailControllerDelegate {
weak var delegate: AuthManagerDelegate?
func signInWithFacebook(controller: UIViewController) {
...
let authVC = ExistingEmailController()
authVC.delegate = self
UIApplication.shared.windows.first?.rootViewController?.present(authVC, animated: true, completion: nil)
}
func someMethodFromExistingEmailControllerDelegate() {
delegate?.someMethod() // delegating it self.delegate, which StartController conforms to
}
}
protocol AuthManagerDelegate : class {
func someMethod()
}
class StartController: UIViewController, AuthManagerDelegate {
var authManager: AuthManager!
override func viewDidLoad() {
authManager = AuthManager()
authManager.delegate = self
}
@objc private func presentAuthFacebookController() {
authManager.signInWithFacebook(controller: self)
}
func someMethod() {
// write here the code that you would have written in someMethodFromExistingEmailControllerDelegate
}
}