Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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
Xcode 如果没有强制展开/nil错误,则无法展开可选文件_Xcode_Swift_Macos_Cocoa_Optional - Fatal编程技术网

Xcode 如果没有强制展开/nil错误,则无法展开可选文件

Xcode 如果没有强制展开/nil错误,则无法展开可选文件,xcode,swift,macos,cocoa,optional,Xcode,Swift,Macos,Cocoa,Optional,我在一个文本编辑器上工作,字符串选项有问题。我想使用textView的string方法;由于它是可选的,Xcode坚持要我打开它。当我使用Xcode建议的强制展开时,我会得到运行时错误;我更喜欢使用可选的链接,这样nil值就不会导致崩溃。但我无法让可选链接正常工作 要打开并保存工作,我尝试在WindowControllerdLoadNib中使用self.textViewOne.string=self.text,在dataOfType中使用self.text=self.textViewOne.st

我在一个文本编辑器上工作,字符串选项有问题。我想使用textView的string方法;由于它是可选的,Xcode坚持要我打开它。当我使用Xcode建议的强制展开时,我会得到运行时错误;我更喜欢使用可选的链接,这样nil值就不会导致崩溃。但我无法让可选链接正常工作

要打开并保存工作,我尝试在WindowControllerdLoadNib中使用self.textViewOne.string=self.text,在dataOfType中使用self.text=self.textViewOne.string。但我在解包一个可选值时意外地发现了nil崩溃。文档告诉我应该使用if-let来正确地执行此操作,但我不能;当我尝试添加if-let或if-var时,我得到了一个预期的模式错误,可能是因为self.text变量已经存在,但我不知道如何正确地展开

在dataOfType中,我甚至尝试用一个笨拙的规则if-then语句将其展开:

if ((self.textViewOne.string) != nil)
{
    self.text = self.textViewOne.string
}
else
{
   self.text = ""
}
但即使这样也不行:Xcode仍然坚持使用!在self.textViewOne.string之后,以及带或不带!我仍然会遇到一个致命错误:在展开可选值时意外发现nil

编辑:以下是Document类当前的完整代码,包括原始帖子后的一些修补,但仍然会出现错误:

import Cocoa

class Document: NSDocument {

@IBOutlet var textViewOne: NSTextView!

@IBOutlet var textViewTwo: NSTextView!

var text = ""

override init() {
    super.init()
    // Add your subclass-specific initialization here.
}

override func windowControllerDidLoadNib(aController: NSWindowController) {

    // The window has loaded, and is ready to display.
    // Take the text that we loaded earlier and display it in the text field

    super.windowControllerDidLoadNib(aController)

    self.textViewOne.string = self.text

}

override class func autosavesInPlace() -> Bool {
    return true
}

override var windowNibName: String? {
    // Returns the nib file name of the document
    // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this property and override -makeWindowControllers instead.
    return "Document"
}

override func dataOfType(typeName: String?, error outError: NSErrorPointer) -> NSData? {

    // Convert the contents of the text field into data, and return it

    if (self.textViewOne == nil)
    {
        println ("self.textViewOne is nil.")
    }

    if let someText = self.textViewOne.string {
        self.text = someText
    } else {
        self.text = ""
    }

    return self.text.dataUsingEncoding( NSUTF8StringEncoding, allowLossyConversion: false)

}

override func readFromData(data: NSData, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {

    // Attempt to load a string from the data; if it works, store it in self.text

    if data.length > 0
    {
        let string = NSString( data: data, encoding: NSUTF8StringEncoding)
        self.text = string!
    }
    else
    { self.text = "" }

    return true

 }

}
使用if let从self.textViewOne中展开非nil值怎么样

使用if let从self.textViewOne中展开非nil值怎么样


好吧,现在我真的很困惑。这听起来是一个非常好、简单、可行的解决方案。我正是使用了这段代码来复制和粘贴它。。。但仍然得到了完全相同的错误!致命错误:在解包时意外发现nil,控制台中显示可选值lldb,带有if-let行。在第1行旁边:Thread 1:EXC_BAD_指令代码=EXC_I386_INVOP,子代码=0x0.@DisplacedHoser您能验证self.textViewOne不是nil吗?你能编辑你的问题来显示更多的代码和你试图设置文本的上下文吗?我很快会添加更多的代码,但首先我只想说:我检查过了,看起来self.textViewOne确实是零,但我认为使用非强制展开的全部目的是确保代码仍然可以工作,即使可选值为零。@DisplacedHoster是的,但我进行展开的方式是假设self.textViewOne为非零。self.textViewOne和IBOutlet是吗?你在哪里调用这个代码?在尝试访问插座之前,请确保插座已加载。已添加上述代码。是的,textViewOne是一个IBOutlet。你所说的加载是指用@IBOutlet声明吗?它也需要实例化吗?好吧,现在我真的很困惑。这听起来是一个非常好、简单、可行的解决方案。我正是使用了这段代码来复制和粘贴它。。。但仍然得到了完全相同的错误!致命错误:在解包时意外发现nil,控制台中显示可选值lldb,带有if-let行。在第1行旁边:Thread 1:EXC_BAD_指令代码=EXC_I386_INVOP,子代码=0x0.@DisplacedHoser您能验证self.textViewOne不是nil吗?你能编辑你的问题来显示更多的代码和你试图设置文本的上下文吗?我很快会添加更多的代码,但首先我只想说:我检查过了,看起来self.textViewOne确实是零,但我认为使用非强制展开的全部目的是确保代码仍然可以工作,即使可选值为零。@DisplacedHoster是的,但我进行展开的方式是假设self.textViewOne为非零。self.textViewOne和IBOutlet是吗?你在哪里调用这个代码?在尝试访问插座之前,请确保插座已加载。已添加上述代码。是的,textViewOne是一个IBOutlet。你所说的加载是指用@IBOutlet声明吗?它也需要实例化吗?可选链接意味着在let value=house?.person?.dog?.name中,您不需要打开每个可选项,如果链的任何链接为零,则该值将为零,但请记住,值也将是可选的。可选链接意味着在let value=house?.person?.dog?.name中,您不需要打开每个可选项,如果链的任何链接为零,则该值将为零,但请记住,值也将是可选的。
if let someText = self.textViewOne.string {
    self.text = someText
} else {
    self.text = ""
}