2014-09-12 10 views
53

Utworzono klasę Swift zgodną z NSCoding. (Xcode 6 GM, Swift 1,0)Otrzymałem nierozpoznany selektor -replacementObjectForKeyedArchiver: awarię podczas implementowania NSCoding w 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") 
    } 
} 

Ale gdy zgłoszę ...

let data = NSKeyedArchiver.archivedDataWithRootObject(cmd);

To awarii daje mi ten błąd.

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

Co należy zrobić?

+2

Tutaj jest najlepszą odpowiedzią http://stackoverflow.com/a/24416671/1118772 – Noundla

+0

@noundla Nie, odpowiedź w linku nie robi 't pracować z moim problemem.Próbowałem obu rozwiązań. 1) Dodanie '@ objc' do mojej klasy polecenia i metody NSCoding nadal daje mi ten sam błąd. 2) Dodanie 'NSObject' jest takie samo jak moja odpowiedź. Lepiej spróbuj najpierw następnym razem. – Hlung

+0

Wczoraj miałem ten sam problem i rozwiązania sprawdziły się. Użyłem obu rozwiązań 1 i 2, aby rozwiązać problem. – Noundla

Odpowiedz

164

Chociaż Swift klasa działa bez dziedziczenia, ale w celu wykorzystania NSCoding trzeba dziedziczą NSObject.

class Command: NSObject, NSCoding { 
    ... 
} 

Szkoda błąd kompilator nie jest bardzo pouczające :(

+0

Dzięki! Uratowałeś mój dzień! –

+1

Mam ten problem po zwróceniu niestandardowego obiektu Swift wewnątrz słownika do bloku wywołania zwrotnego. Chciałbym wiedzieć, jak powinienem wiedzieć, że wartości w tych słownikach musiały być zgodne z "NSCoding". – Rivera

+0

@Rivera 'NSCoding' protocol pozwala na przekonwertowanie obiektu na obiekt' NSData', dzięki czemu można zrobić takie rzeczy, jak przechowywanie go w NSUserDefaults, itp. Nie wiem, czy to, co robisz, wymaga tego. To wszystko co mogę powiedzieć. – Hlung

Powiązane problemy