[swift-evolution] Property Selectors

David Sweeris davesweeris at mac.com
Tue Mar 14 03:42:55 CDT 2017




Sent from my iPhone
> On Mar 14, 2017, at 01:02, Andrew Thompson via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 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?

I think you can already do that with `UnsafeMutablePointer`. I think. I'm really tired, so maybe if I look at it again in the morning I'll immediately see a difference. Apart from the syntax, of course, which is nice.

-Dave Sweeris



More information about the swift-evolution mailing list