Skip to content

Instantly share code, notes, and snippets.

@TerryCK
Last active December 26, 2017 10:41
Show Gist options
  • Save TerryCK/2f48e04565a760c26eed5edbe1d2f648 to your computer and use it in GitHub Desktop.
Save TerryCK/2f48e04565a760c26eed5edbe1d2f648 to your computer and use it in GitHub Desktop.
strategy runtime error
protocol Presentable {
func presenting(with viewController: UIViewController)
}
extension Presentable where Self: UIViewController {
func presenting(with viewController: UIViewController) {
switch self {
case let pushableViewContorller as Pushable:
pushableViewContorller.present(on: viewController)
case let setableViewContorller as Setable:
setableViewContorller.present(on: viewController)
default:
print("exception error: can't viewContorller presented, plz check: Presentable in Lobby MenuViewController.swift")
}
}
}
protocol PresentStrategy where Self: UIViewController {
func present(on viewController: UIViewController, animated: Bool)
}
protocol Pushable: Presentable, PresentStrategy { }
extension Pushable {
func present(on viewController: UIViewController, animated: Bool = true) {
viewController.navigationController?.pushViewController(self, animated: animated)
}
}
protocol Setable: Presentable, PresentStrategy { }
extension Setable {
func present(on viewController: UIViewController, animated: Bool = false) {
viewController.navigationController?.setViewControllers([self], animated: animated)
}
}
//MARK: Extensions to conform Pushable
extension BankingMenu: Pushable {}
extension StatementMenu: Pushable {}
extension MyAccountMenu: Pushable {}
extension SupportMenu: Pushable {}
extension TermsConditionsMenu: Pushable {}
extension LanguageSetting: Pushable {}
extension MessageMenu: Pushable {}
//MARK: Extensions to conform Stable
extension WKWebViewController: Setable {}
extension SettingMenu: Setable {}
//modified: corrected!
//MARK: - PresentStrategy
protocol Presentable {
func present(with presentStrategy: PresentStrategy)
}
extension LobbyMenuViewController: Presentable {
func present(with presentStrategy: PresentStrategy) {
guard let viewController = presentStrategy as? UIViewController else { return }
switch presentStrategy {
case is Pushable:
self.navigationController?.pushViewController(viewController, animated: true)
case is Setable:
self.navigationController?.setViewControllers([viewController], animated: false)
default:
print("exception error: can't viewContorller presented, plz check: Presentable in Lobby MenuViewController.swift")
}
}
}
//MARK: - Protocol PresentStrategy
protocol PresentStrategy { }
protocol Pushable : PresentStrategy { }
protocol Setable : PresentStrategy { }
//MARK: - Extensions to conform Pushable
extension BankingMenu : Pushable {}
extension StatementMenu : Pushable {}
extension MyAccountMenu : Pushable {}
extension SupportMenu : Pushable {}
extension TermsConditionsMenu : Pushable {}
extension LanguageSetting : Pushable {}
extension MessageMenu : Pushable {}
//MARK: - Extensions to conform Stable
extension WKWebViewController : Setable {}
extension SettingMenu : Setable {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment