带有Swift变量的system()命令

时间:2014-06-11 15:06:43

标签: objective-c swift xcode6

这里我提出了另一个noob问题:我试图在Swift中编写一个非常简单的程序,并且在尝试使用变量从程序中运行shell命令时遇到困难。

一个简单的例子:写system("say hello")有效。

但是以下代码不起作用:

var whatToSay = "hello world"
system("say \(whatToSay)")

构建程序时遇到的错误是:Could not find member 'convertFromStringInterpolatingSegment'

任何帮助?

2 个答案:

答案 0 :(得分:5)

您需要强制转换才能获得CString

var whatToSay = "hello world"
var nsCommand : NSString = "say \(whatToSay)"
var command : CString? = nsCommand.cStringUsingEncoding(NSUTF8StringEncoding)
system(command!)

修改

如果您经常使用它,则可以使用String的扩展程序:

extension String {
    func toCString() -> CString? {
        let nsSelf : NSString = self
        return nsSelf.cStringUsingEncoding(NSUTF8StringEncoding)
    }
}

var whatToSay = "hello world"
system("say \(whatToSay)".toCString()!)

答案 1 :(得分:1)

在Swift 2.1(Xcode 7.1)中,如果你需要在OS X中运行像say这样的命令,你也可以使用NSTask,如this blog post

所示

基本上,有些东西(如果你不需要检查命令输出,那就是):

import Foundation

let task = NSTask()
task.launchPath = "/usr/bin/say"
task.arguments = ["Hello", "World!"]

let pipe = NSPipe()
task.standardOutput = pipe
task.launch()