Как получить доступ к аргументам программы в Swift?

C и производные имеют параметры argc и argvenvp) для своих функций точки входа, но Swift не имеет одного правильного: код верхнего уровня - это просто код и у него нет параметров.

Как получить доступ к эквиваленту argc и argv в программе Swift?

Ответ 1

Процесс был просто переименован в CommandLine (начиная с моментального снимка Swift 3.0 августа 4)

let arguments = CommandLine.arguments

(по какой-то причине это не упоминалось в changelog)

Ответ 2

Process.arguments - ваш друг!

К счастью, это намного проще, и он встроен: ничего не импортирует, не загрязняя ваши руки C объективным или другим.

Рассмотрим это, назовем его args.swift:

версия Swift 2:

var c = 0;
for arg in Process.arguments {
    println("argument \(c) is: \(arg)")
    c++
}

версия Swift 3:

var c = 0;
for arg in CommandLine.arguments {
    print("argument \(c) is: \(arg)")
    c += 1
}

Мы можем скомпилировать и запустить его следующим образом:

$ swift -o args args.swift && ./args fee fi fo fum
argument 0 is: ./args
argument 1 is: fee
argument 2 is: fi
argument 3 is: fo
argument 4 is: fum

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

Кажется, что каждый аргумент является строкой, как и следовало ожидать.

Я очень надеюсь, что Process станет более полезным, поскольку Swift созревает, но сейчас кажется, что он дает вам только аргументы. Что очень много, если вы пытаетесь написать программу pure-Swift.

Ответ 3

Как только ваше приложение будет работать, я буду использовать информацию о процессе:

let args = NSProcessInfo.processInfo().arguments
print(args)

Ничего небезопасного там, очень удобно.

Обратите внимание, что вы должны import Foundation (или Cocoa/UIKit).

Ответ 4

Для Swift 3 вы можете использовать этот код:

let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))

что эквивалентно параметрам argc и argv, используемым в основной функции Objective-C:

int main(int argc, char *argv[])

Для более старых версий Swift вы можете использовать Process.argc и Process.unsafeArgv или C_ARGC и C_ARGV.

Вы можете передать эти переменные функции UIApplicationMain в приложении iOS:

Swift 3:

let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))
UIApplicationMain(argc, argv, nil, NSStringFromClass(AppDelegate.self))

предыдущие версии Swift:

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))

или

UIApplicationMain(C_ARGC, C_ARGC, nil, NSStringFromClass(AppDelegate.self))

Objective-C:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

Ответ 5

     import Foundation


     println(C_ARGC) //CInt    
     println(C_ARGV) // CString

Как и в приведенном выше коде, вы можете использовать C_ARGC для получения количества аргументов. C_ARGV, чтобы получить эти аргументы.