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?



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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.