-1

我试图通过改变它NSTextField 的来源来改变它的内容,但它给了我一个错误。ViewControllerstringValueAppDelegate

中的代码AppDelegate是:

class AppDelegate: NSObject, NSApplicationDelegate {

    var consoleOutput:String? = "Console Output"

    func executeCommand(command: String, args: [String]) -> String {

        let task = NSTask()
        task.launchPath = command
        task.arguments = args

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

        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        let output:String = NSString(data: data, encoding: NSUTF8StringEncoding)!
        consoleOutput = output
        return output
    }
}

它从以下位置调用ViewController

var myDelegate = NSApplication.sharedApplication().delegate! as AppDelegate

并且NSTextFieldIBOutlet较早创建的:

@IBOutlet weak var outputText: NSTextField!

并尝试稍后修改:

outputText.stringValue = myDelegate.consoleOutput!

但我得到的只是

致命错误:在展开可选值时意外发现 nil

我究竟做错了什么?

4

2 回答 2

1

consoleOuput被声明为可选的 ( ?) 并且可能包含nil在其中。尽管如此,你还是强制解开它 ( !) 而不是检查nil. 这是您的“致命错误”的原因。任何时候你强行打开一个可选的,你都冒着这个错误的风险。

你可能会尝试更多这样的事情:

outputText.stringValue = myDelegate.consoleOutput ?? ""

这将尝试 unwrap myDelegate.consoleOutput,但如果它不能(因为它是nil),它只会将空字符串分配给outputText.stringValue.

??称为“Nil Coalescing Operator”。

于 2015-03-27T22:56:42.413 回答
0

尝试将此行设置let output:String = NSString(data: data, encoding: NSUTF8StringEncoding)!为: let output: String = "Test" 如果这消除了错误,那么您知道它NSString(data: data, encoding: NSUTF8StringEncoding)返回 nil,因此数据管道有问题。

于 2015-03-28T03:11:03.537 回答