NS_ENUM 在 Swift
NS_ENUM in Swift
注意:这不是 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 的内部代码会根据它自己的枚举检查参数。
你可以这样做(虽然它不漂亮):
parser.registerOption("verbose", shortcut: 118 /* Array("v".utf8)[0] */, requirement: GBValueFlags.Required.rawValue)
注意:这不是 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 的内部代码会根据它自己的枚举检查参数。
你可以这样做(虽然它不漂亮):
parser.registerOption("verbose", shortcut: 118 /* Array("v".utf8)[0] */, requirement: GBValueFlags.Required.rawValue)