-1

からNSTextField のをViewController変更して の内容を変更しようとしていますが、エラーが発生します。stringValueAppDelegate

のコード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 ?? ""

これは のラップを解除しようとしmyDelegate.consoleOutputますが、それができない場合 (それが であるためnil)、代わりに空の文字列を に割り当てますoutputText.stringValue

これ??は「Nil Coalescing Operator」として知られています。

于 2015-03-27T22:56:42.413 に答える
0

この行を次のように設定してみてください: let output:String = NSString(data: data, encoding: NSUTF8StringEncoding)!to: let output: String = "Test" これでエラーが解消される場合は、 が nil を返していることがわかります。つまりNSString(data: data, encoding: NSUTF8StringEncoding)、データ パイプに何か問題があります。

于 2015-03-28T03:11:03.537 に答える