2016-03-25 14 views
0

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 

} 

} 
+0

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

cevap

3

Ne unwrap bir if let kullanma hakkında self.textViewOne'dan sıfır olmayan bir değer mi?

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

Tamam, şimdi gerçekten kafam karıştı. Bu çok güzel, basit, uygulanabilir bir çözüm gibi geldi. Tam olarak bu kodu kullandım (kopyalayıp yapıştırmak için) ... ve STILL de aynı hatayı aldım! "ölümcül hata: beklenmedik bir şekilde nil bulunurken bir Opsiyonel değer (lldb) kaldırılırken", "if-let" satırı ile konsolda görünür. (Satırın yanında: "iş parçacığı 1: EXC_BAD_INSTRUCTION (kod = EXC_I386_INVOP, altkutu = 0x0)".) –

+0

@DisplacedHoser 'self.textViewOne' sıfır değil doğrulayabilir misiniz? Sorunuzu daha fazla kod ve metni ayarlamaya çalıştığınız bağlamı göstermek için düzenleyebilir misiniz? – JAL

+0

Yakında daha fazla kod ekleyeceğim, ama önce ben sadece şunu belirtmek istiyorum: ben kontrol ettim ve self.textViewOne gerçekten nil gibi görünüyor, ama zorlanmamış unwrapping kullanarak tüm noktası kodun hala çalışabilir emin olmak için olduğunu düşündüm eğer isteğe bağlı * nil ise. –