How do I access program arguments in Swift?

后端 未结 5 789
别跟我提以往
别跟我提以往 2020-12-01 03:11

C and derivatives have argc and argv (and envp) parameters to their entry point functions, but Swift doesn\'t have one proper: top-lev

相关标签:
5条回答
  • 2020-12-01 03:15

    For Swift 3 you can use this code:

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

    which is equivalent of argc and argv parameters used in Objective-C main function:

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

    For older versions of Swift, you can use Process.argc and Process.unsafeArgv or C_ARGC and C_ARGV.

    You can pass this variables to UIApplicationMain function in iOS app:

    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))
    

    previous Swift versions:

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

    or:

    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]));
        }
    }
    
    0 讨论(0)
  • 2020-12-01 03:24
         import Foundation
    
    
         println(C_ARGC) //CInt    
         println(C_ARGV) // CString
    

    As in the above code, you can use C_ARGC to get number of arguments. C_ARGV to get this arguments.

    0 讨论(0)
  • 2020-12-01 03:30

    As soon as your app is up I'd use the process info:

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

    Nothing unsafe there, very convenient.

    Note that you have to import Foundation (or Cocoa / UIKit).

    0 讨论(0)
  • 2020-12-01 03:41

    Process was just renamed into CommandLine (since Swift 3.0 August 4 snapshot)

    let arguments = CommandLine.arguments
    

    (for some reason this wasn't mentioned on the changelog)

    0 讨论(0)
  • 2020-12-01 03:41

    Process.arguments is your friend!

    Fortunately this is much easier, and built in: no importing anything, no getting your hands dirty with C, objective or otherwise.

    Consider this, let's call it args.swift:

    Swift 2 version:

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

    Swift 3 version:

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

    We can compile and run it like this:

    $ 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
    

    Note that the first argument is the program name, as you might expect.

    It seems every argument is a String, as you might also expect.

    I hope very much that Process becomes more useful as Swift matures, but right now it seems to only give you the arguments. Which is a lot, if you're trying to write a pure-Swift program.

    0 讨论(0)
提交回复
热议问题