Sometimes you would like to modify the value being set to a property before it 
is set.

Currently, you would have to add a separate backing property and implement the 
getter and setter, even if you want to perform a simple bounds-check on the 
value being set and want to cap it to allowed values.

e.g:

var bounds : Bounds {
    willSet {
      // Cap the bounds
      newValue = newValue.capped(to: maximumSize)
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing
    }

    didSet {
      // Load the new bounds
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing
    }
}

Against the workaround you have to do currently:

var _bounds : Bounds
var bounds : Bounds {
    get { return _bounds }
    set {
      // Cap the bounds
      _bounds = newValue.capped(to: maximumSize)
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing

      // Load the new bounds
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing
      // Some comments to demonstrate noise if we were doing more processing
    }
}

Currently, the capping in willSet is a compile-time error because `newValue` is 
a let constant, but I find that breaking your accessor code up in to 
willSet/didSet blocks allows for greater readability, especially when you have 
lots of processing to do (in the workaround example, the 
validation/preprocessing code and effects/postprocessing code are only 
separated by a comment). I propose that, at least for the scope of willSet (and 
*not* didSet, if we can manage that), that the variable should be mutable.

Any thoughts?

Karl


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

Reply via email to