Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 我能';不要在函数中使用进程_Swift_Process - Fatal编程技术网

Swift 我能';不要在函数中使用进程

Swift 我能';不要在函数中使用进程,swift,process,Swift,Process,我有一个问题,我想使用函数Process(),但是当我在函数中调用它时,我得到了 使用未解析的标识符“进程” 但当我在代码中直接调用它时,它就工作了。 有人知道原因吗?由于您既没有提到要针对哪个平台,也没有提供任何类型的代码,因此您需要注意以下事项: 在Swift 3.0中,Process()被重命名为CommandLine() 如果您的目标是iOS,CommandLine()不可用,因此您需要执行以下操作: 在iOS上使用NSTask(): 实现这一点的最佳方法,或者至少是我最喜欢的方法(我也

我有一个问题,我想使用函数
Process()
,但是当我在函数中调用它时,我得到了

使用未解析的标识符“进程”

但当我在代码中直接调用它时,它就工作了。
有人知道原因吗?

由于您既没有提到要针对哪个平台,也没有提供任何类型的代码,因此您需要注意以下事项:

  • 在Swift 3.0中,
    Process()
    被重命名为
    CommandLine()
  • 如果您的目标是iOS,
    CommandLine()
    不可用,因此您需要执行以下操作:
  • 在iOS上使用NSTask(): 实现这一点的最佳方法,或者至少是我最喜欢的方法(我也没有找到任何其他方法),是使用创建对象
    NSTask()
    及其所需的一切的方法

    然后,为了在Swift中使用此代码,您需要创建一个,在其中您需要导入
    NSTask.h
    ,以便它暴露于Swift并能够在Swift代码中使用它

    完成此操作后,只要在代码中使用以下函数即可运行任务:

    func task(launchPath: String, arguments: String...) -> NSString {
        let task = NSTask.init()
        task?.setLaunchPath(launchPath)
        task?.arguments = arguments
    
        // Create a Pipe and make the task
        // put all the output there
        let pipe = Pipe()
        task?.standardOutput = pipe
    
        // Launch the task
        task?.launch()
        task?.waitUntilExit()
    
        // Get the data
        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
    
        return output!
    }
    
    这样称呼它:

    task(launchPath: "/usr/bin/echo", arguments: "Hello World")
    
    这也将返回值,因此您甚至可以通过执行以下操作来显示该值:

    print(task(launchPath: "/usr/bin/echo", arguments: "Hello, World!"))
    
    将打印:

    ~> Hello, World!
    
    要使其正常工作且不引发
    nsinternalinconsistenceexception
    ,您需要将启动路径设置为可执行文件的完整路径,而不是仅设置为包含它的目录

    您还需要设置所有由逗号分隔的命令参数

    在iPad Mini 2(iOS 12.1~>越狱)和iPhone Xr(iOS 12.2~>非越狱)上测试

    注意:尽管这在非越狱和越狱设备上都有效,但您的应用程序将在AppStore上被拒绝,如下所述:

    您正在使用私有API,因此它将在应用商店中被拒绝。另外,Xcode 11有一些新功能,在使用某些专用API时会触发构建失败。 我只建议在不会上传到应用商店的应用程序中使用此选项,否则,尝试在不使用命令的情况下实现您想要的,肯定会有其他方法来实现


    如果您的应用程序针对越狱iOS设备,并将上载到Cydia、Zebra、Thunderbolt或Sileo等第三方商店,那么这将正常工作。

    由于您既没有提到您的目标平台,也没有提供任何类型的代码,您需要注意以下事项:

  • 在Swift 3.0中,
    Process()
    被重命名为
    CommandLine()
  • 如果您的目标是iOS,
    CommandLine()
    不可用,因此您需要执行以下操作:
  • 在iOS上使用NSTask(): 实现这一点的最佳方法,或者至少是我最喜欢的方法(我也没有找到任何其他方法),是使用创建对象
    NSTask()
    及其所需的一切的方法

    然后,为了在Swift中使用此代码,您需要创建一个,在其中您需要导入
    NSTask.h
    ,以便它暴露于Swift并能够在Swift代码中使用它

    完成此操作后,只要在代码中使用以下函数即可运行任务:

    func task(launchPath: String, arguments: String...) -> NSString {
        let task = NSTask.init()
        task?.setLaunchPath(launchPath)
        task?.arguments = arguments
    
        // Create a Pipe and make the task
        // put all the output there
        let pipe = Pipe()
        task?.standardOutput = pipe
    
        // Launch the task
        task?.launch()
        task?.waitUntilExit()
    
        // Get the data
        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
    
        return output!
    }
    
    这样称呼它:

    task(launchPath: "/usr/bin/echo", arguments: "Hello World")
    
    这也将返回值,因此您甚至可以通过执行以下操作来显示该值:

    print(task(launchPath: "/usr/bin/echo", arguments: "Hello, World!"))
    
    将打印:

    ~> Hello, World!
    
    要使其正常工作且不引发
    nsinternalinconsistenceexception
    ,您需要将启动路径设置为可执行文件的完整路径,而不是仅设置为包含它的目录

    您还需要设置所有由逗号分隔的命令参数

    在iPad Mini 2(iOS 12.1~>越狱)和iPhone Xr(iOS 12.2~>非越狱)上测试

    注意:尽管这在非越狱和越狱设备上都有效,但您的应用程序将在AppStore上被拒绝,如下所述:

    您正在使用私有API,因此它将在应用商店中被拒绝。另外,Xcode 11有一些新功能,在使用某些专用API时会触发构建失败。 我只建议在不会上传到应用商店的应用程序中使用此选项,否则,尝试在不使用命令的情况下实现您想要的,肯定会有其他方法来实现


    如果您的应用程序针对越狱iOS设备,并将上载到Cydia、Zebra、Thunderbolt或Sileo等第三方商店,则这将正常工作。

    欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。最小、完整、可验证的示例适用于此处。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。请提供您的代码欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。最小、完整、可验证的示例适用于此处。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。请提供您的代码