我正在尝试通过更改来自NSTextField
的{{1}}来更改ViewController
中stringValue
的内容,但它会给我一个错误。
AppDelegate
中的代码是:
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
是之前创建的NSTextField
:
IBOutlet
并尝试稍后修改:
@IBOutlet weak var outputText: NSTextField!
但我得到的只是
致命错误:在解包可选值时意外发现nil
我做错了什么?
答案 0 :(得分:1)
consoleOuput
被声明为可选(?
),其中可能包含nil
。尽管如此,你还是强行打开它(!
)而不是检查nil
。这是导致您致命错误的原因#34;。每当你强行打开一个可选项时,你都会冒这个错误。
你可以尝试更像这样的东西:
outputText.stringValue = myDelegate.consoleOutput ?? ""
这将尝试展开myDelegate.consoleOutput
,但如果它不能(因为它是nil
),它只会将空字符串分配给outputText.stringValue
??
被称为" Nil Coalescing Operator"。
答案 1 :(得分:0)
尝试设置此行:let output:String = NSString(data: data, encoding: NSUTF8StringEncoding)!
至:let output: String = "Test"
如果这样可以消除错误,那么您知道NSString(data: data, encoding: NSUTF8StringEncoding)
返回nil,因此数据管道出现问题。