2014-09-12 14 views
53

'da NSCoding uygulandığında çökme NSCoding'e uyan bir Swift sınıfı oluşturdum. (Xcode 6 GM, Swift 1,0)Tanınmayan seçici var -replacementObjectForKeyedArchiver: Swift

import Foundation 

private var nextNonce = 1000 

class Command: NSCoding { 

    let nonce: Int 
    let string: String! 

    init(string: String) { 
     self.nonce = nextNonce++ 
     self.string = string 
    } 

    required init(coder aDecoder: NSCoder) { 
     nonce = aDecoder.decodeIntegerForKey("nonce") 
     string = aDecoder.decodeObjectForKey("string") as String 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeInteger(nonce, forKey: "nonce") 
     aCoder.encodeObject(string, forKey: "string") 
    } 
} 

Ama dediğim zaman ... O çöküyor

let data = NSKeyedArchiver.archivedDataWithRootObject(cmd);

bana bu hata veriyor.

2014-09-12 16:30:00.463 MyApp[30078:60b] *** NSForwarding: warning: object 0x7a04ac70 of class '_TtC8MyApp7Command' does not implement methodSignatureForSelector: -- trouble ahead 
Unrecognized selector -[MyApp.Command replacementObjectForKeyedArchiver:] 

Ne yapmalıyım?

+2

iyi yanıtı http://stackoverflow.com/a/24416671/1118772 – Noundla

+0

@noundla Hayır, doesn bağlantınızda cevaptır :(çok bilgilendirici değil Sorunumla çalışıyorum, her iki çözümü de denedim 1) Komut sınıfıma ve NSCoding yöntemlerine '@ objc 'eklenmesi hala bana aynı hatayı veriyor. 2) 'NSObject' eklemek benim cevabımla aynı. İlk seferinde denemelisin. – Hlung

+0

Dün aynı sorunu yaşadım ve bu çözümler benim için çalıştı. Sorunu çözmek için hem 1 hem de 2 çözüm kullandım. – Noundla

cevap

164

Swift sınıf miras olmadan çalışır, ancak NSObject devralınmalıdır NSCoding kullanmak için rağmen.

class Command: NSObject, NSCoding { 
    ... 
} 

Çok kötü derleyici hatası İşte

+0

Teşekkürler! Günümü kurtardın! –

+1

Bir sözlüğün içinde özel bir Swift nesnesini geri arama bloğuna döndürürken bu sorunu yaşıyorum. Bu sözlüklerdeki değerlerin 'NSCoding' ile uyumlu olduğunu bilmek zorunda olduğumu bilmek isterim. – Rivera

+0

@Rivera 'NSCoding' protokolü, nesnenin 'NSData' nesnesine dönüştürülmesini sağlar, böylece NSUserDefaults, vb. Içinde depolamak gibi şeyler yapabilirsiniz. Aslında ne yaptığınızı bilmiyorum. Söyleyebileceğim tek şey bu. – Hlung

İlgili konular