有无法识别的选择器-replacementObjectForKeyedArchiver:在Swift中实现NSCoding时崩溃


69

我创建了一个符合NSCoding的Swift类。(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")
    }
}

但是当我打电话...

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

我该怎么办?



@noundla不,您链接中的答案不适用于我的问题。我尝试了两种解决方案。1)添加@objc到我的Command类和NSCoding方法仍然会给我同样的错误。2)添加NSObject与我的答案相同。下次您最好先尝试一下。
Hlung 2014年

昨天我遇到了同样的问题,并且解决方案对我有用。我同时使用了1和2解决方案来解决此问题。
Noundla Sandeep

@noundla奇怪。可能仅仅是因为我们的问题不同。您的有关performSelector:,而我的则与NSCoding协议有关。
Hlung 2014年

Answers:


221

尽管Swift类无需继承即可工作,但是要使用它,NSCoding您必须从继承NSObject

class Command: NSObject, NSCoding {
    ...
}

太糟糕了,编译器错误不是很有用:(


1
将字典中的自定义Swift对象返回给回调块时出现此问题。我想知道我应该怎么知道那些字典中的价值必须符合NSCoding
Rivera

@RiveraNSCoding协议允许将对象转换为NSData对象,因此您可以执行将其存储在NSUserDefaults中的操作,等等。我实际上不知道您是否正在执行此操作。这就是我能说的。
Hlung 2015年

我正在使用WatchKit。原因是作为参数传递的字典必须与属性列表兼容。它没有记录,但显示在控制台日志中。
Rivera

而且您必须在继承子句中将NSObject作为第一个对象。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.