[英]NS_ENUM in Swift
注意 :這不是對這個問題的重復。
我正在嘗試在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'
的錯誤,且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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.