Nicht erkannter Selektor -replacementObjectForKeyedArchiver: Absturz beim Implementieren von NSCoding in Swift

69

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?

Hlung
quelle
2
Hier ist die beste Antwort stackoverflow.com/a/24416671/1118772
Noundla Sandeep
@noundla Nein, die Antwort in deinem Link funktioniert nicht mit meinem Problem. Ich habe beide Lösungen ausprobiert. 1) Das Hinzufügen @objczu meiner Befehlsklasse und meinen NSCoding-Methoden gibt mir immer noch den gleichen Fehler. 2) Das Hinzufügen entspricht NSObjectgenau meiner Antwort. Versuchen Sie es besser beim nächsten Mal.
Hlung
Ich hatte gestern das gleiche Problem und diese Lösungen haben bei mir funktioniert. Ich habe sowohl 1 als auch 2 Lösungen verwendet, um das Problem zu lösen.
Noundla Sandeep
@noundla Weird. Vielleicht liegt es nur daran, dass unsere Probleme anders sind. Bei Ihnen geht es um performSelector:, aber bei mir geht es um das NSCoding-Protokoll.
Hlung

Antworten:

221

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 :(

Hlung
quelle
1
Ich habe dieses Problem, wenn ein benutzerdefiniertes Swift-Objekt in einem Wörterbuch an einen Rückrufblock zurückgegeben wird. Ich würde gerne wissen, woher ich wissen sollte, dass die Werte in diesen Wörterbüchern übereinstimmen müssen NSCoding.
Rivera
Mit dem @ Rivera- NSCodingProtokoll kann ein Objekt in ein Objekt konvertiert werden, NSDatasodass 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.
Hlung
Ich habe mit WatchKit gearbeitet. Der Grund war, dass als Parameter übergebene Wörterbücher mit der Eigenschaftsliste kompatibel sein müssen. Es ist nicht dokumentiert, wird aber in den Konsolenprotokollen angezeigt.
Rivera
Und Sie müssen NSObject als erstes in der Vererbungsklausel haben.
Pei