[swift-evolution] Property Selectors
Andrew Thompson
mrwerdo331 at me.com
Tue Mar 14 03:02:05 CDT 2017
Hello Swift Evolution Community,
I’ve been thinking about a new language feature that would allow properties to be first class citizens. The basic idea is as follows:
let x: PropertySelector<UIView, CGFloat> = #property(UIView.frame.origin.x)
let view: UIView = …
view.frame.origin.x = 20
x.read(view) // returns 20
x.write(view, value: 9091)
view.frame.origin.x // now 9091
This is a trivial example, but now we can do more interesting things in our code. For example, we can animate any property on a view (that is documented to be animatable of course):
func animate(view: UIView, property: PropertySelector<UIView, CGFloat>, amount: Int) {
let originalValue = property.read(view)
func generateKeyFrames() {
let step = 1.0 / Double(amount)
for i in 0..<amount {
let newValue = originalValue + CGFloat(i)
let time = Double(i) / Double(amount)
UIView.addKeyframe(withRelativeStartTime: time,
relativeDuration: step,
animations: { property.write(view, value: newValue) }
)
}
}
UIView.animateKeyframes(withDuration: 1.0,
delay: 0,
options: [],
animations: generateKeyFrames,
completion: nil)
}
let myView: UIView = …
myView.frame = CGRect(x: 20, y: 100, width: 99, height: 120)
// once this completes, myView.frame.origin.x == 120
animate(view: myView, property: #property(UIView.frame.origin.x), amount: 100)
// once this completes, myView.frame.size.width == 198
animate(view: myView, property: #property(UIView.frame.size.width), amount: 99)
I think this would be a pretty neat feature to have, what do you think?
Cheers,
- Andrew
More information about the swift-evolution
mailing list