> 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
