Skip to content

Instantly share code, notes, and snippets.

@ARamy23
Last active April 28, 2022 11:00
Show Gist options
  • Save ARamy23/1959c60eb0a3696d1327fe457f7e2afb to your computer and use it in GitHub Desktop.
Save ARamy23/1959c60eb0a3696d1327fe457f7e2afb to your computer and use it in GitHub Desktop.
import Foundation
import UIKit
enum WidgetType {
case search
case banner
}
class Interactor {
func buildWidgets() {
let widgets = [WidgetType]()
widgets.append(.search)
presenter.present(widgets)
}
}
class Presenter {
func present(_ widgets: [WidgetType]) {
viewController.display(widgets)
}
}
protocol Widgetable: UIView {
var widgetType: WidgetType { get }
}
class SearchWidgetView: UIView, Widgetable {
var widgetType: WidgetType = .search
var onTap: (() -> Void)?
var onTimeIntent: (() -> Void)?
}
struct Banner { }
class BannerWidgetView: UIView, Widgetable {
var widgetType: WidgetType = .banner
var onTap: ((Banner) -> Void)?
}
class ViewController {
let searchWidget: SearchWidgetView = .init()
let bannerWidget: BannerWidgetView = .init()
let stackView: UIStackView = .init()
var allWidgets: [Widgetable] {
[
searchWidget,
bannerWidget
]
}
func display(widgets: [WidgetType]) {
allWidgets
.filter { widgets.contains($0.widgetType) }
.forEach { stackView.addArrangedSubview($0) }
}
func viewDidLoad() {
searchWidget.onTap = { }
searchWidget.onTimeIntent = { }
bannerWidget.onTap = { banner in }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment