Ich habe eine Swift-Klasse erstellt, die der NSCoding entspricht. (Xcode 6 GM, Swift 1.0)
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")
}
}
Aber wenn ich anrufe ...
let data = NSKeyedArchiver.archivedDataWithRootObject(cmd);
Es stürzt ab, gibt mir diesen Fehler.
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:]
Was soll ich machen?
@objc
zu meiner Befehlsklasse und meinen NSCoding-Methoden gibt mir immer noch den gleichen Fehler. 2) Das Hinzufügen entsprichtNSObject
genau meiner Antwort. Versuchen Sie es besser beim nächsten Mal.performSelector:
, aber bei mir geht es um das NSCoding-Protokoll.Antworten:
Die Swift-Klasse funktioniert zwar ohne Vererbung, aber um sie zu verwenden
NSCoding
, müssen Sie von erbenNSObject
.class Command: NSObject, NSCoding { ... }
Schade, dass der Compilerfehler nicht sehr informativ ist :(
quelle
NSCoding
.NSCoding
Protokoll kann ein Objekt in ein Objekt konvertiert werden,NSData
sodass Sie es beispielsweise in NSUserDefaults usw. speichern können. Ich weiß nicht, ob das, was Sie tun, dies erfordert. Das ist alles was ich sagen kann.