簡體   English   中英

Swift中的NS_ENUM

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM