$ rxmvvm "AddressList" "LightPass" "Leonardo Cardoso" "1aim.com" .
- $1 = Name of File
- $2 = Name of Project
- $3 = Name of Author
- $4 = Website
- $5 = Path
| function rxmvvm { | |
| # Usage = rxmvvm "AddressList" "LightPass" "Leonardo Cardoso" "1aim.com" . | |
| # $1 = Name of File | |
| # $2 = Name of Project | |
| # $3 = Name of Author | |
| # $4 = Website | |
| # $5 = Path | |
| mkdir $5/Extensions | |
| mkdir $5/View\ Models | |
| mkdir $5/Views | |
| echo "// | |
| // $1ViewController.swift | |
| // $2 | |
| // | |
| // Created by $3 on `date +%d/%m/%Y`. | |
| // Copyright © 2017 $4. All rights reserved. | |
| // | |
| import UIKit | |
| #if !RX_NO_MODULE | |
| import RxSwift | |
| import RxCocoa | |
| #endif | |
| final class $1ViewController: UIViewController { | |
| // MARK: - Rx | |
| private let bag = DisposeBag() | |
| // MARK: - Properties | |
| private var customView: $1View? | |
| // MARK: - Lifecycle | |
| override func viewDidLoad() { super.viewDidLoad() } | |
| // MARK: - Functions | |
| /** | |
| Set up view controller | |
| */ | |
| static func setUp(viewModel: $1ViewModelType) -> $1ViewController { | |
| let controller = $1ViewController() | |
| controller.customView = .setUp(superview: controller.view) | |
| controller.customView?.layout() | |
| controller.configureBindings(viewModel: viewModel) | |
| return controller | |
| } | |
| /** | |
| Configure view model | |
| */ | |
| internal func configureBindings(viewModel: $1ViewModelType) { | |
| // 2-way Binding | |
| // Input | |
| // Output | |
| } | |
| }" > $5/$1ViewController.swift | |
| echo "// | |
| // $1ViewController+UITableViewDelegate.swift | |
| // $2 | |
| // | |
| // Created by $3 on `date +%d/%m/%Y`. | |
| // Copyright © 2017 $4. All rights reserved. | |
| // | |
| /// UITableViewDelegate | |
| extension $1ViewController: UITableViewDelegate { | |
| func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { | |
| } | |
| func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { | |
| return 40 | |
| } | |
| }" > $5/Extensions/$1ViewController+UITableViewDelegate.swift | |
| echo "// | |
| // $1ViewController+UITableViewDataSource.swift | |
| // $2 | |
| // | |
| // Created by $3 on `date +%d/%m/%Y`. | |
| // Copyright © 2017 $4. All rights reserved. | |
| // | |
| /// UITableViewDataSource | |
| extension $1ViewController: UITableViewDataSource { | |
| func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { | |
| return String() | |
| } | |
| func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | |
| return 0 | |
| } | |
| func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { | |
| return UITableViewCell() | |
| } | |
| }" > $5/Extensions/$1ViewController+UITableViewDataSource.swift | |
| echo "// | |
| // $1ViewModel.swift | |
| // $2 | |
| // | |
| // Created by $3 on `date +%d/%m/%Y`. | |
| // Copyright © 2017 $4. All rights reserved. | |
| // | |
| #if !RX_NO_MODULE | |
| import RxSwift | |
| import RxCocoa | |
| #endif | |
| protocol $1ViewModelType { | |
| // MARK: - 2-way Binding | |
| // MARK: - Input | |
| // MARK: - Output | |
| // MARK: - Flow | |
| // MARK: - Initializers | |
| init() | |
| } | |
| final class $1ViewModel: $1ViewModelType { | |
| // MARK: - Properties | |
| // MARK: - Rx | |
| private let bag = DisposeBag() | |
| // MARK: - 2-way Binding | |
| // MARK: - Input | |
| // MARK: - Output | |
| // MARK: - Flow | |
| // MARK: - Initializers | |
| required init() { | |
| } | |
| }" > $5/View\ Models/$1ViewModel.swift | |
| echo "// | |
| // $1View.swift | |
| // $2 | |
| // | |
| // Created by $3 on `date +%d/%m/%Y`. | |
| // Copyright © 2017 $4. All rights reserved. | |
| // | |
| import UIKit | |
| import SnapKit | |
| import Then | |
| #if !RX_NO_MODULE | |
| import RxSwift | |
| import RxCocoa | |
| #endif | |
| final class $1View: UIView { | |
| // MARK: - Properties | |
| var wrapperView: UIView? | |
| // MARK: - Functions | |
| /** | |
| Set up views. | |
| */ | |
| static func setUp(superview: UIView) -> $1View { | |
| let view = $1View() | |
| view.configureSubviews() | |
| if let wrapperView = view.wrapperView { view.addSubview(wrapperView) } | |
| superview.addSubview(view) | |
| return view | |
| } | |
| /** | |
| Configure subviews. | |
| */ | |
| func configureSubviews() { | |
| wrapperView = UIView().then { | |
| \$0.backgroundColor = .white | |
| } | |
| } | |
| // Set up layout | |
| func layout() { | |
| snp.makeConstraints { | |
| \$0.width.equalToSuperview() | |
| \$0.height.equalToSuperview() | |
| } | |
| wrapperView?.snp.makeConstraints { | |
| \$0.width.equalToSuperview() | |
| \$0.height.equalToSuperview() | |
| } | |
| } | |
| }" > $5/Views/$1View.swift | |
| } |