Xcode 如果没有强制展开/nil错误,则无法展开可选文件
我在一个文本编辑器上工作,字符串选项有问题。我想使用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语句将其展开: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
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 = ""
}