我正在使用文本编辑器,但我遇到了字符串选项问题。我想使用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
}
}
答案 0 :(得分:3)
如何使用if let
从self.textViewOne
解包非零值?
if let someText = self.textViewOne.string {
self.text = someText
} else {
self.text = ""
}