如果没有强制解包/零错误,则无法打开可选项

时间:2016-03-25 14:44:00

标签: xcode swift macos cocoa optional

我正在使用文本编辑器,但我遇到了字符串选项问题。我想使用textView的字符串方法;因为它是可选的,Xcode坚持要我打开它。当我使用强制解包时(这是Xcode推荐的)我得到运行时错误;我更喜欢使用可选链接,以便nil值不会导致崩溃。但我无法选择可选的链接。

要打开并保存工作,我正在尝试在windowControllerDidLoadNib中使用self.textViewOne.string = self.text,在dataOfType中使用self.text = self.textViewOne.string。但是我遇到“在解开一个Optional值时意外发现nil”的崩溃。文档告诉我,我应该使用if-let or even if-var来正确地执行此操作,但我不能;当我尝试添加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后,有或没有!我仍然得到一个“致命的错误:在解开一个Optional值时意外地发现了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

 }

}

1 个答案:

答案 0 :(得分:3)

如何使用if letself.textViewOne解包非零值?

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