Skip to content

Instantly share code, notes, and snippets.

@LH17
LH17 / ViewStateProtocol.swift
Created June 2, 2017 12:10
ViewStateProtocol protocol
protocol ViewStateProtocol: class {
var stateManager: StateManager? { get }
var loadingView: UIView? { get }
var errorView: UIView? { get }
var emptyView: UIView? { get }
var errorMessage: String? { get set }
func addView(withState state: StatesType)
}
@LH17
LH17 / ViewStateProtocolExtension.swift
Last active June 3, 2017 14:13
ViewStateProtocol extension
extension ViewStateProtocol where Self: UIViewController {
// State manager class to remove/add views
var stateManager: StateManager? {
return StateManager.sharedInstance
}
// Loading view
var loadingView: UIView? {
return LoadingView(frame: UIScreen.main.bounds)
@LH17
LH17 / ViewStateProtocolExtension_AddViews.swift
Last active June 2, 2017 12:28
ViewStateProtocol extension
extension ViewStateProtocol where Self: UIViewController {
..........
// Manages and adds different views on the basis of the state
func addView(withState state: StatesType) {
// error state, empty state & loading state
switch state {
case .loading:
// calls state manager to add a laoding view
stateManager?.addView(loadingView!, forState: StatesType.loading.rawValue, superview: view)
@LH17
LH17 / StatesType.swift
Created June 2, 2017 12:25
StatesType enum
enum StatesType: String {
case error = "error"
case empty = "empty"
case loading = "loading"
case none = "none"
}
@LH17
LH17 / StateManager.swift
Created June 2, 2017 12:33
StateManager Singleton class
class StateManager {
static let sharedInstance = StateManager()
var viewStore: [String: UIView] = [:]
// Associates a view for the given state
public func addView(_ view: UIView, forState state: String, superview: UIView) {
viewStore[state] = view
superview.addSubview(view)
}
@LH17
LH17 / StateViewController.swift
Last active June 5, 2017 09:19
StateViewController
class StateViewController: UIViewController {}
extension StateViewController: ViewStateProtocol {
@objc func handleTap(_ sender: UIView) {
// for showing the loader
addView(withState: .loading)
// for showing the error message
addView(withState: .error)
precedencegroup UnionOperatorPrecedence {
associativity: left
}
infix operator ∪: UnionOperatorPrecedence
func ∪ <T:Equatable>(lhs: [T], rhs:[T])->[T] {
var result = lhs
for element in rhs {
if !lhs.contains(element) {
precedencegroup IntersectionOperatorPrecedence {
associativity: left
}
infix operator ∩: IntersectionOperatorPrecedence
func ∩<T: Equatable> (left: [T], right: [T]) -> [T] {
var intersection: [T] = []
for value in left {
if right.contains(value) {
precedencegroup UnionOperatorPrecedence {
associativity: left
higherThan: IntersectionOperatorPrecedence
}
@LH17
LH17 / Prototype Pattern.swift
Last active April 14, 2018 12:54
Prototype Design Pattern
// Protocol
protocol Fruit {
func set(price: String?)
func clone() -> Fruit
}
// Class Apple which implements the protocol
class Apple: Fruit {
var count: Int