[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