Swift中的NS_ENUM

时间:2016-03-15 14:50:35

标签: objective-c swift enums compiler-errors objective-c-swift-bridge

注意:这不是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的内部代码会根据自己的枚举检查参数。

1 个答案:

答案 0 :(得分:1)

你可以这样做(尽管它并不漂亮):

parser.registerOption("verbose", shortcut: 118 /* Array("v".utf8)[0] */, requirement: GBValueFlags.Required.rawValue)