2016-03-25 6 views
0

テキストエディタで作業中で、文字列オプションに問題があります。私は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 

} 

} 
+0

オプションのチェーンとは、 'let value = house?.person?.dog?.name'では、オプションのそれぞれをアンラップする必要はなく、' value'は 'nil'になります。チェーンは 'nil'ですが、' value'もオプションであることに留意してください。 – EmilioPelaez

答えて

3

何アンラップするif letの使用についてself.textViewOneからのnil以外の値?

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

さて、今私は本当に混乱しています。それは非常に素晴らしく、シンプルで、実行可能なソリューションのように聞こえました。私はちょうどそのコードを使用して(それをコピーして貼り付けた時点まで)...そして、まったく同じエラーが発生しました! 「致命的なエラー:オプション値(lldb)をアンラッピングしている間に予期せず見つからないnil」がif-let行とともにコンソールに表示されます。 (行の横に「スレッド1:EXC_BAD_INSTRUCTION(コード= EXC_I386_INVOP、サブコード= 0x0)」。) –

+0

@DisplacedHoser 'self.textViewOne'がnilでないことを確認できますか?質問を編集して、より多くのコードとテキストを設定しようとしているコンテキストを表示できますか? – JAL

+0

私はすぐにコードを追加しますが、最初に言いたいのは、チェックしたところ、self.textViewOneは実際にはnilのようですが、アンフォースアンラッピングを使用することの全ポイントは、オプションの*が* nilだった場合。 –

関連する問題