[swift-evolution] Property Selectors

David Sweeris davesweeris at mac.com
Tue Mar 14 10:26:31 CDT 2017


Ah, yes! That whole sleep thing really does help.

Sent from my iPhone

> On Mar 14, 2017, at 03:51, jaden.geller at gmail.com wrote:
> 
> 
> 
>> On Mar 14, 2017, at 1:42 AM, David Sweeris via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> 
>> 
>> 
>> 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.
> 
> 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
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution


More information about the swift-evolution mailing list