Open
Description
I was attempting to migrate the following Obj-C code to Dart:
[item addObserver:observer
forKeyPath:@"loadedTimeRanges"
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:NULL];
Where the options are defined by:
typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) {
NSKeyValueObservingOptionNew = 0x01,
NSKeyValueObservingOptionOld = 0x02,
NSKeyValueObservingOptionInitial = 0x04,
NSKeyValueObservingOptionPrior = 0x08
};
The generated code is:
enum NSKeyValueObservingOptions {
NSKeyValueObservingOptionNew(1),
NSKeyValueObservingOptionOld(2),
NSKeyValueObservingOptionInitial(4),
NSKeyValueObservingOptionPrior(8);
final int value;
const NSKeyValueObservingOptions(this.value);
static NSKeyValueObservingOptions fromValue(int value) => switch (value) {
1 => NSKeyValueObservingOptionNew,
2 => NSKeyValueObservingOptionOld,
4 => NSKeyValueObservingOptionInitial,
8 => NSKeyValueObservingOptionPrior,
_ => throw ArgumentError(
"Unknown value for NSKeyValueObservingOptions: $value"),
};
}
which is essentially unusable:
-
First, it doesn't define
operator |
, so they can't be directly combined. -
Second, and worse, that can't be worked around. Before I looked at the full implementation when I just got the error about
|
, I tried:NSKeyValueObservingOptions.fromValue( NSKeyValueObservingOptions.NSKeyValueObservingOptionInitial.value | NSKeyValueObservingOptions.NSKeyValueObservingOptionNew.value)
but that throws the
ArgumentError
at runtime because, of course, the combination of two values is not one of the values.
Since the whole point of NS_OPTIONS
as distinct from NS_ENUM
is to allow combining values, the generator needs to make different code for NS_OPTIONS
.
Metadata
Metadata
Assignees
Type
Projects
Status
Todo