0

ПРИМЕЧАНИЕ: Это не обман this question.NS_ENUM in Swift

Я пытаюсь использовать библиотеку с именем GBCli в Swift. Это было написано в 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 является исключительным, поэтому они не предназначены для OR.

Тем не менее, это дает ошибку 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?

Определение собственного enum не будет работать, потому что внутренний код GBCli проверяет аргумент против его собственного перечисления.

+1

Как насчет 'parser.registerOption ("многословный", ярлык: 118/* Array ("v" .utf8) [0] * /, требование: GBValueFlags.Required.rawValue) '? –

+0

@JonBrooks СПАСИБО !!! Опубликуйте как ответ, и я соглашусь. – Coder256

ответ

1

Вы можете сделать это так (хотя это не очень):

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