首页 文章

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

提问于
浏览
0

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

为了打开并保存工作,我试图在windowControllerDidLoadNib中使用 self.textViewOne.string = self.text 并在dataOfType中使用 self.text = self.textViewOne.string . 但是我遇到了"unexpectedly found nil while unwrapping an Optional value"的崩溃 . 文档告诉我应该使用if-let or even if-var来正确地执行此操作,但我可以't; when I try to add if-let or if-var, I get an 571104 error, probably because the self.text variable already exists - but I don't知道如何正确解包 .

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 回答

  • 3

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

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

相关问题