1. ホーム
  2. ios

Got 認識できないセレクタ -replacementObjectForKeyedArchiver: Swift で NSCoding を実装する際にクラッシュする。

2023-09-24 13:12:33

質問

NSCodingに準拠したSwiftのクラスを作成しました。(Xcode6GM、Swift1.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")
    }
}

でも、電話すると...

let data = NSKeyedArchiver.archivedDataWithRootObject(cmd);

クラッシュするとこんなエラーが出ます。

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

どうすればいいのでしょうか?

どのように解決するのですか?

Swiftのクラスは継承をしなくても動作しますが、そのために NSCoding を使うには を継承する必要があります。 NSObject .

class Command: NSObject, NSCoding {
    ...
}

コンパイラのエラーはあまり参考にならないのが残念 :(