C和派生词的入口点函数有argc
和argv
(以及envp
)个参数,但Swift没有正确的参数:顶级代码只是代码而且它没有参数。
如何在Swift程序中访问等效的argc
和argv
?
答案 0 :(得分:43)
答案 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.argc
或Process.unsafeArgv
和C_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得到这个论点。