テキストエディタで作業中で、文字列オプションに問題があります。私はtextViewの文字列メソッドを使用したいです。それはオプションなので、Xcodeは私がそれをアンラップすることを主張します。 Xcodeが推奨する強制アンラッピングを使用すると、ランタイムエラーが発生します。私は任意の値がクラッシュを引き起こさないように、オプションの連鎖を使用することを好むでしょう。しかし、私はオプションの連鎖を働かせることはできません。強制アンラッピング/無しエラーなしでオプションをアンラップできません。
開いて保存するには、windowControllerDidLoadNibにself.textViewOne.string = self.text
、dataOfTypeにself.text = self.textViewOne.string
を使用しようとしています。しかし、私は「予期せぬことに、オプション値をアンラッピングしている間にゼロが見つかりました」というクラッシュを取得します。ドキュメントでは、これを正しく行うにはif-let or even if-varを使用する必要がありますが、できません。 if-letまたはif-varを追加しようとすると、おそらくself.text変数がすでに存在しているため、「Expected pattern」というエラーが発生しますが、正しく展開する方法がわかりません。 dataOfType
で
私もkludgey、正規のif-then文でそれをアンラップしようとした:
if ((self.textViewOne.string) != nil)
{
self.text = self.textViewOne.string
}
else
{
self.text = ""
}
それでも問題が解決しない:Xcodeは、まだを主張! self.textViewOne.stringの後、および!私はまだ "致命的なエラーが発生します:予期せず、オプション値をアンラッピングしている間にゼロが見つかりません"。
EDIT:それは現在(オリジナルのポスト後いじりのビットを含むが、それでもエラーを取得)スタンドとしてここ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
}
}
オプションのチェーンとは、 'let value = house?.person?.dog?.name'では、オプションのそれぞれをアンラップする必要はなく、' value'は 'nil'になります。チェーンは 'nil'ですが、' value'もオプションであることに留意してください。 – EmilioPelaez