Bir metin editörü üzerinde çalışıyorum ve dize isteğe bağlı sorun yaşıyorum. TextView'ın string yöntemini kullanmak istiyorum; isteğe bağlı olduğundan, Xcode onu açmam konusunda ısrar ediyor. Zorla açmayı kullanırken (Xcode'un önerdiği şey) çalışma zamanı hatalarım var; İsteğe bağlı zincirlemeyi kullanmayı tercih ederim, böylece nil değerleri çarpmaya neden olmaz. Ama çalışmak için isteğe bağlı zincirleme alamıyorum.Zorla açmadan isteğe bağlı olarak açamıyorsunuz unwrapping/nil hatası
Çalışmayı açmak ve kaydetmek için, self.textViewOne.string = self.text
windowControllerDidLoadNib ve self.text = self.textViewOne.string
dataOfType öğesinde kullanmaya çalışıyorum. Ama "Opsiyonel bir değer çıkarılırken beklenmedik bir şekilde bulunabilecek bir şekilde" çöküşünü kazanıyorum. Belgeler, bunu düzgün yapabilmem için or even if-var kullanmam gerektiğini söylüyor, ancak yapamam; if-let veya if-var eklemeyi denediğimde, muhtemelen bir "Expected pattern" hatası alıyorum, muhtemelen self.text değişkeni zaten mevcut olduğu için - ama nasıl düzgün bir şekilde dolanacağımı bilmiyorum.
if ((self.textViewOne.string) != nil)
{
self.text = self.textViewOne.string
}
else
{
self.text = ""
}
ama bu bile çalışmıyor: dataOfType
yılında
Hatta bir kludgey düzenli şart-deyimi ile paketini çalıştı Xcode hala ısrar! self.textViewOne.string sonra ve ile veya olmadan! Hâlâ "ölümcül bir hata: Opsiyonel bir değer çıkarılırken beklenmedik şekilde sıfır bulundu" alıyorum.
DÜZENLEME: İşte şu anda (hata orijinal mesajdan sonra uğraşının biraz da dahil, ama yine de alma) haliyle Belge sınıfı için komple kod:
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
}
}
Opsiyonel zincirleme 'in değeri = evini izin anlamına gelir? .person? .dog? Her isteğe paketini gerekmez ve value' nil' Herhangi bir bağlantı içinde eğer' olacaktır 'o .name' zincir 'nil' dir, ama akılda tutulur ki' değer' de isteğe bağlı olacaktır. – EmilioPelaez