Hello folks! Recently I've discovered UIViewInvalidating protocol in UIKIt, and wanted to extend it like that:
protocol RenderableView {
associatedtype P: Hashable
var props: P { get }
func render()
}
extension UIView.Invalidations {
struct Render<View: RenderableView>: UIViewInvalidating {
func invalidate(view: UIView) {
guard let renderable = view as? View else { return }
renderable.render()
}
}
}
It works fine, but unfortunately, it seems to be obscured to compile protocol extension as it requires to specify generic
// Reference to generic type 'UIView.Invalidations.Render' requires arguments in <...>
extension UIViewInvalidating where Self == UIView.Invalidations.Render {
static var render: Render { .init() }
}
Is it possible to achieve something like this?
class ExampleView: UIView, RenderableView {
// Currently it is UIView.Invalidations.Render<ExampleView>()
// instead of .render
@Invalidating(.render, .layout)
var props: Props = .empty
private let label = UILabel()
func render() {
label.attributedText = NSAttributedString(string: props.text)
}
struct Props: Hashable {
let text: String
static let empty = Props(text: "")
}
}