注意:这不是this question的伪装。
我正在尝试在Swift中使用名为GBCli的库。它是用Objective-C编写的。我遇到一个特殊的枚举问题:
/** Various command line argument value requirements. */
typedef NS_ENUM(NSUInteger, GBValueFlags) {
GBValueRequired, ///< Command line argument requires a value.
GBValueOptional, ///< Command line argument can optionally have a value, but is not required.
GBValueNone ///< Command line argument is on/off switch.
};
我正在尝试使用该方法:
- (void)registerOption:(NSString *)longOption shortcut:(char)shortOption requirement:(GBValueRequirements)requirement;
在文档中,建议使用的是:
[parser registerOption:@"verbose" shortcut:'v' requirement:GBValueRequired];
我尝试将其翻译为:
parser.registerOption("verbose", shortcut: 118 /* Array("v".utf8)[0] */, requirement: .Required);
注意:似乎GBValueRequirements
是库使用的参数类型,但GBValueFlag
是他们打算传递给所述方法的实际类型。证据:typedef NSUInteger GBValueRequirements;
,上面提到的枚举,以及许多函数采用GBValueRequirements
的事实。另请注意,GBValueFlags
中的每个案例都是独占的,因此它们并不意味着要在一起进行“或”运算。
然而,这给出了Type 'UInt' has no member 'Required'
的错误,这看起来枚举被定义为类型NSUInteger
(它应该转换为UInt)是没有意义的。我能够访问GBValueFlags,但我无法看到swift将其翻译成什么。奇怪的是,这有效:
let requiredTest : GBValueFlags = .Required;
但这不是:
parser.registerOption("verbose", shortcut: 118 /* Array("v".utf8)[0] */, requirement: requiredTest);
因为它抛出:
Cannot convert value of type 'GBValueFlags' to expected argument type 'UInt'
在编译时。我应该如何将等效的.Required
传递给方法?
定义我自己的枚举将不起作用,因为GBCli的内部代码会根据自己的枚举检查参数。
答案 0 :(得分:1)
你可以这样做(尽管它并不漂亮):
parser.registerOption("verbose", shortcut: 118 /* Array("v".utf8)[0] */, requirement: GBValueFlags.Required.rawValue)