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
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution