-
-
Save V8tr/b08a624a0d08a5388dce37afc7a2b01e to your computer and use it in GitHub Desktop.
This file contains hidden or 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 Foundation | |
import UIKit | |
struct ViewStyle<T> { | |
let style: (T) -> Void | |
} | |
let filled = ViewStyle<UIButton> { | |
$0.setTitleColor(.white, for: .normal) | |
$0.backgroundColor = .red | |
} | |
let rounded = ViewStyle<UIButton> { | |
$0.layer.cornerRadius = 4.0 | |
} | |
extension ViewStyle { | |
func compose(with style: ViewStyle<T>) -> ViewStyle<T> { | |
return ViewStyle<T> { | |
self.style($0) | |
style.style($0) | |
} | |
} | |
} | |
let roundedAndFilled = rounded.compose(with: filled) | |
extension ViewStyle where T: UIButton { | |
static var filled: ViewStyle<UIButton> { | |
return ViewStyle<UIButton> { | |
$0.setTitleColor(.white, for: .normal) | |
$0.backgroundColor = .red | |
} | |
} | |
static var rounded: ViewStyle<UIButton> { | |
return ViewStyle<UIButton> { | |
$0.layer.cornerRadius = 4.0 | |
} | |
} | |
static var roundedAndFilled: ViewStyle<UIButton> { | |
return rounded.compose(with: filled) | |
} | |
} | |
func style<T>(_ object: T, with style: ViewStyle<T>) { | |
style.style(object) | |
} | |
protocol Stylable { | |
init() | |
} | |
extension UIView: Stylable {} | |
extension Stylable { | |
init(style: ViewStyle<Self>) { | |
self.init() | |
apply(style) | |
} | |
func apply(_ style: ViewStyle<Self>) { | |
style.style(self) | |
} | |
} | |
let button = UIButton(style: .roundedAndFilled) | |
button.setTitle("My Button", for: .normal) | |
button.sizeToFit() | |
button |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment