> On Mar 14, 2017, at 1:42 AM, David Sweeris via swift-evolution 
> <[email protected]> wrote:
> 
> 
> 
> 
> Sent from my iPhone
>> On Mar 14, 2017, at 01:02, Andrew Thompson via swift-evolution 
>> <[email protected]> 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.

You definitely shouldn't try to replicate this with a pointer. At least one 
place that will break down is computed properties (as well as `didSet` and 
friends), but I imagine there are more. Also, this sort of operation should not 
require dropping down to an unsafe construct!

It's worth noting this is sort of equivalent to defining a type that stores 
functions that, given a type, will get or set a certain property. It would need 
to be initialized with 2 lambdas though.

> 
> -Dave Sweeris
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to