如何在Swift中访问程序参数?

时间:2014-06-03 07:08:42

标签: swift command-line command-line-arguments

C和派生词的入口点函数有argcargv(以及envp)个参数,但Swift没有正确的参数:顶级代码只是代码而且它没有参数。

如何在Swift程序中访问等效的argcargv

5 个答案:

答案 0 :(得分:43)

进程刚刚重命名为 CommandLine (自Swift 3.0 8月4日快照以来)

$ sed 's/:.*//' file
TEXT1

(出于某种原因,changelog上没有提及)

答案 1 :(得分:38)

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

请注意,第一个参数是程序名称,正如您所料。

似乎每个参数都是一个String,正如您可能还期望的那样。

我非常希望Process在Swift成熟时变得更有用,但现在它似乎只给你参数。如果您正在尝试编写纯粹的Swift程序,那么这很多。

答案 2 :(得分:11)

只要您的应用启动,我就会使用流程信息:

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

那里没什么不安全的,非常方便。

请注意,您必须import Foundation(或Cocoa / UIKit)。

答案 3 :(得分:11)

对于 Swift 3 ,您可以使用以下代码:

  function onEdit() {
    var sheet = SpreadsheetApp.openById("Add Sheet ID").getSheetByName('Sheet1');
    var rows = sheet.getDataRange();
    var numRows = rows.getNumRows();
    var values = rows.getValues();

    var rowsDeleted = 0;
      for (var i = 0; i <= numRows - 1; i++) {
        var row = values[i];

          //row for condition
          if (row[7].indexOf("Bekreft")) {     
            sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
            rowsDeleted++;
     }
    }
   };

相当于Objective-C主函数中使用的let argc = CommandLine.argc let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) argc参数:

argv

对于旧版Swift,您可以使用int main(int argc, char *argv[]) Process.argcProcess.unsafeArgvC_ARGC

您可以将此变量传递给iOS app中的C_ARGV函数:

斯威夫特3:

UIApplicationMain

以前的Swift版本:

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

或:

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

目标-C:

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

答案 4 :(得分:1)

     import Foundation


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

与上面的代码一样,您可以使用C_ARGC来获取参数的数量。 C_ARGV得到这个论点。