Created
July 8, 2019 05:50
-
-
Save pavel-sazonov/a2b22a4dce442bcd7188dd648b9912de to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
// MVC: | |
//struct Person { // Model | |
// let firstName: String | |
// let lastName: String | |
//} | |
// | |
//class GreetingViewController : UIViewController { // View + Controller | |
// var person: Person! | |
// let showGreetingButton = UIButton() | |
// let greetingLabel = UILabel() | |
// | |
// override func viewDidLoad() { | |
// super.viewDidLoad() | |
// self.showGreetingButton.addTarget(self, action: #selector(didTapButton(button:)), for: .touchUpInside) | |
// } | |
// | |
// @objc func didTapButton(button: UIButton) { | |
// let greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName | |
// self.greetingLabel.text = greeting | |
// | |
// } | |
// // layout code goes here | |
//} | |
//// Assembling of MVC | |
//let model = Person(firstName: "David", lastName: "Blaine") | |
//let view = GreetingViewController() | |
//view.person = model; | |
// MVP: | |
//struct Person { // Model | |
// let firstName: String | |
// let lastName: String | |
//} | |
// | |
//protocol GreetingView: class { | |
// func setGreeting(greeting: String) | |
//} | |
// | |
//protocol GreetingViewPresenter { | |
// init(view: GreetingView, person: Person) | |
// func showGreeting() | |
//} | |
// | |
//class GreetingPresenter : GreetingViewPresenter { | |
// unowned let view: GreetingView | |
// let person: Person | |
// | |
// required init(view: GreetingView, person: Person) { | |
// self.view = view | |
// self.person = person | |
// } | |
// func showGreeting() { | |
// let greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName | |
// self.view.setGreeting(greeting: greeting) | |
// } | |
//} | |
// | |
//class GreetingViewController : UIViewController, GreetingView { | |
// var presenter: GreetingViewPresenter! | |
// let showGreetingButton = UIButton() | |
// let greetingLabel = UILabel() | |
// | |
// override func viewDidLoad() { | |
// super.viewDidLoad() | |
// self.showGreetingButton.addTarget(self, action: #selector(didTapButton(button:)), for: .touchUpInside) | |
// } | |
// | |
// @objc func didTapButton(button: UIButton) { | |
// self.presenter.showGreeting() | |
// } | |
// | |
// func setGreeting(greeting: String) { | |
// self.greetingLabel.text = greeting | |
// } | |
// | |
// // layout code goes here | |
//} | |
//// Assembling of MVP | |
//let model = Person(firstName: "David", lastName: "Blaine") | |
//let view = GreetingViewController() | |
//let presenter = GreetingPresenter(view: view, person: model) | |
//view.presenter = presenter | |
// MVVM: | |
//struct Person { // Model | |
// let firstName: String | |
// let lastName: String | |
//} | |
// | |
//protocol GreetingViewModelProtocol: class { | |
// var greeting: String? { get } | |
// var greetingDidChange: ((GreetingViewModelProtocol) -> ())? { get set } // function to call when greeting did change | |
// init(person: Person) | |
// func showGreeting() | |
//} | |
// | |
//class GreetingViewModel : GreetingViewModelProtocol { | |
// let person: Person | |
// | |
// var greeting: String? { | |
// didSet { | |
// self.greetingDidChange?(self) | |
// } | |
// } | |
// | |
// var greetingDidChange: ((GreetingViewModelProtocol) -> ())? | |
// | |
// required init(person: Person) { | |
// self.person = person | |
// } | |
// | |
// func showGreeting() { | |
// self.greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName | |
// } | |
//} | |
// | |
//class GreetingViewController : UIViewController { | |
// var viewModel: GreetingViewModelProtocol! { | |
// didSet { | |
// self.viewModel.greetingDidChange = { [unowned self] viewModel in | |
// self.greetingLabel.text = viewModel.greeting | |
// } | |
// } | |
// } | |
// let showGreetingButton = UIButton() | |
// let greetingLabel = UILabel() | |
// | |
// override func viewDidLoad() { | |
// super.viewDidLoad() | |
// self.showGreetingButton.addTarget(self, action: #selector(didTapButton(button:)), for: .touchUpInside) | |
// } | |
// | |
// @objc func didTapButton(button: UIButton) { | |
// self.viewModel.showGreeting() | |
// } | |
// // layout code goes here | |
//} | |
//// Assembling of MVVM | |
//let model = Person(firstName: "David", lastName: "Blaine") | |
//let viewModel = GreetingViewModel(person: model) | |
//let view = GreetingViewController() | |
//view.viewModel = viewModel | |
// VIPER: | |
struct Person { // Entity (usually more complex e.g. NSManagedObject) | |
let firstName: String | |
let lastName: String | |
} | |
struct GreetingData { // Transport data structure (not Entity) | |
let greeting: String | |
let subject: String | |
} | |
protocol GreetingProvider { | |
func provideGreetingData() | |
} | |
protocol GreetingOutput: class { | |
func receiveGreetingData(_ greetingData: GreetingData) | |
} | |
protocol GreetingViewEventHandler { | |
func didTapShowGreetingButton() | |
} | |
protocol GreetingView: class { | |
func setGreeting(_ greeting: String) | |
} | |
class GreetingInteractor : GreetingProvider { | |
weak var output: GreetingOutput! | |
func provideGreetingData() { | |
let person = Person(firstName: "David", lastName: "Blaine") // usually comes from data access layer | |
let subject = person.firstName + " " + person.lastName | |
let greeting = GreetingData(greeting: "Hello", subject: subject) | |
self.output.receiveGreetingData(greeting) | |
} | |
} | |
class GreetingPresenter : GreetingOutput, GreetingViewEventHandler { | |
weak var view: GreetingView! | |
var greetingProvider: GreetingProvider! | |
func didTapShowGreetingButton() { | |
self.greetingProvider.provideGreetingData() | |
} | |
func receiveGreetingData(_ greetingData: GreetingData) { | |
let greeting = greetingData.greeting + " " + greetingData.subject | |
self.view.setGreeting(greeting) | |
} | |
} | |
class GreetingViewController : UIViewController, GreetingView { | |
var eventHandler: GreetingViewEventHandler! | |
let showGreetingButton = UIButton() | |
let greetingLabel = UILabel() | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
self.showGreetingButton.addTarget(self, action: #selector(didTapButton(button:)), for: .touchUpInside) | |
} | |
@objc func didTapButton(button: UIButton) { | |
self.eventHandler.didTapShowGreetingButton() | |
} | |
func setGreeting(_ greeting: String) { | |
self.greetingLabel.text = greeting | |
} | |
// layout code goes here | |
} | |
// Assembling of VIPER module, without Router | |
let view = GreetingViewController() | |
let presenter = GreetingPresenter() | |
let interactor = GreetingInteractor() | |
view.eventHandler = presenter | |
presenter.view = view | |
presenter.greetingProvider = interactor | |
interactor.output = presenter |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment