0

備註:這不是this question的騙局。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',這是沒有意義的看到該枚舉被定義爲類型NSUInteger(它應該轉換爲UInt)。我能夠訪問GBValueFlags,但我無法看到任何迅速翻譯它。奇怪的是,這個工程:

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

怎麼樣'parser.registerOption( 「詳細」,便道:118/*陣列( 「V」 .utf8)[0] * /,要求:GBValueFlags.Required.rawValue)'? –

+0

@JonBrooks謝謝!作爲回答發佈,我會接受。 – Coder256

回答

1

你可以像下面這樣做(儘管它不漂亮):

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