Ответ 1
Процесс был просто переименован в CommandLine (начиная с моментального снимка Swift 3.0 августа 4)
let arguments = CommandLine.arguments
(по какой-то причине это не упоминалось в changelog)
C и производные имеют параметры argc
и argv
(и envp
) для своих функций точки входа, но Swift не имеет одного правильного: код верхнего уровня - это просто код и у него нет параметров.
Как получить доступ к эквиваленту argc
и argv
в программе Swift?
Процесс был просто переименован в CommandLine (начиная с моментального снимка Swift 3.0 августа 4)
let arguments = CommandLine.arguments
(по какой-то причине это не упоминалось в changelog)
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.
Как только ваше приложение будет работать, я буду использовать информацию о процессе:
let args = NSProcessInfo.processInfo().arguments
print(args)
Ничего небезопасного там, очень удобно.
Обратите внимание, что вы должны import Foundation
(или Cocoa
/UIKit
).
Для 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]));
}
}
import Foundation
println(C_ARGC) //CInt
println(C_ARGV) // CString
Как и в приведенном выше коде, вы можете использовать C_ARGC для получения количества аргументов. C_ARGV, чтобы получить эти аргументы.