MOTIVATION:
Many Cocoa classes which allow the user to choose from a list of items, such as NSPopUpButton, NSSegmentedControl, and NSTabView, offer the ability to bind the view to an integer or string in the model via KVO, through bindings such as “Selected Tag”, “Selected Index”, “Selected Identifier”, and the like. Since it can be tough to remember all the tags and whatnot that are associated with each view, it’s usually been helpful to create an enum to keep track of them… until now, since Objective-C cannot see Swift enums, and therefore they cannot be marked ‘dynamic’ for KVO.
One can work around that by declaring two properties, one of which wraps the other, like this:
enum SortMethod: Int {
case byName = 0
case bySize = 1
case byModificationDate = 2
}
var sortMethod: SortMethod {
willSet { self.willChangeValue(forKey: “sortMethod”) }
didSet { self.didChangeValue(forKey: “sortMethod”) }
}
@objc(sortMethod) private dynamic var objcSortMethod: Int {
get { return self.sortMethod.rawValue }
set(newValue) { self.sortMethod = SortMethod(rawValue: newValue)! }
}
However, this is cumbersome.
PROPOSED SOLUTION:
I propose that if an property is typed to an enum, and that enum is backed by an Objective-C-bridgeable type, the property should be visible to Objective-C as its underlying type. So, for example, if you simply declared “var sortMethod: SortMethod” with the @objc attribute or the ‘dynamic’ keyword, it would generate the longer code shown above. This would allow easy binding of UI elements in .xib files to enums in your model.
ALTERNATIVES CONSIDERED:
We could introduce some sort of annotation allowing the user to specify a default case in the event that Objective-C tried to set the property to a value not covered in the enum, instead of just crashing. However, doing such a thing is almost always the result of a programmer error, so I do not consider this of high importance.
Charles