2016-12-23 3 views
3

Я пытаюсь использовать Getopt с аргументами командной строки в Swift 3. Я от Michele Dall'Agata's nice stackoverflow contribution:Как использовать getopt с аргументами командной строки в Swift 3?

let pattern = "abc:" 
var buffer = Array(pattern.utf8).map { Int8($0) } 

Когда я затем использовать этот код:

let option = Int(getopt(CommandLine.argc, CommandLine.arguments, buffer)) 

Я получаю эту ошибку:

Cannot convert value of type '[String]' to expected argument type 'UnsafePointer<UnsafeMutablePointer<Int8>?>!'

для CommandLine.arguments, который я пытаюсь использовать как argv. Кто-нибудь знает правильный синтаксис для второго аргумента для getopt? Заранее спасибо!

+0

Скопируйте данную ошибку. – Alexander

+0

Это ошибка в Xcode точно так же, как она появляется над CommandLine.arguments. – Dribbler

+0

Даже часть '' UnsafePointer?>! ''? – Alexander

ответ

6

@Hamish уже ответил на этот вопрос и объяснил, как пройти CommandLine.unsafeArgv к getopt() в Swift (и почему).

Вот полный самодостаточным пример того, как типичный Getopt цикл может быть реализован в Swift 3:

var aFlag = false 
var bFlag = false 
var cValue: String? 

while case let option = getopt(CommandLine.argc, CommandLine.unsafeArgv, "abc:"), option != -1 { 
    switch UnicodeScalar(CUnsignedChar(option)) { 
    case "a": 
     aFlag = true 
    case "b": 
     bFlag = true 
    case "c": 
     cValue = String(cString: optarg) 
    default: 
     fatalError("Unknown option") 
    } 
} 

print(aFlag, bFlag, cValue ?? "?") 

Примечание:

  • Вы можете передать Swift строки (здесь: "abc:") непосредственно к функции C , ожидающей (константной) строки C, компилятор автоматически генерирует временное представление UTF-8.
  • getopt() возвращение -1 (если список аргументов исчерпан) или unsigned char, преобразованный в int. Поэтому безопасно до преобразовать возвращаемое значение в CUnsignedChar (что составляет UInt8 в Свифт).
  • while используется (злоупотребление?) С сопоставлением с образцом плюс дополнительного логического условием для реализации типичной С формой

    while ((option = getopt(argc, argv, "abc:")) != -1) { ... } 
    

    в Swift.

5

CommandLine.arguments дает дружественный Swift [String] из переданных аргументов - однако вы хотите, чтобы отправить аргументы прямо назад к C. Таким образом, вы можете просто использовать CommandLine.unsafeArgv вместо этого, который даст вам фактическое необработанное значение argv передается вашей программы.

let option = Int(getopt(CommandLine.argc, CommandLine.unsafeArgv, buffer))