从NSKeyedArchiver获取崩溃
2016-10-06 17:06:06.713 MessagesExtension[24473:2175316] *** NSForwarding:
warning: object 0x61800009d740 of class '' does not implement
methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[MessagesExtension.Model replacementObjectForKeyedArchiver:]
我创建了一个名为 Coding 的协议,其目的是简化 NSCoding 和 NSKeyedArchiver ,而无需使用件Objective-C。
protocol Coding {
static var directory: FileManager.SearchPathDirectory { get }
static var domainMask: FileManager.SearchPathDomainMask { get }
func encode() -> [String: AnyObject]
init()
init?(dict: [String: AnyObject]?)
}
extension Coding {
static var directory: FileManager.SearchPathDirectory {
return .documentDirectory
}
static var domainMask: FileManager.SearchPathDomainMask {
return .userDomainMask
}
static var directoryURL: String? {
return NSSearchPathForDirectoriesInDomains(Self.directory, Self.domainMask, true).last?.appending("/")
}
func save(to path: String) -> Bool {
guard let url = Self.directoryURL else { return false }
return NSKeyedArchiver.archiveRootObject(self.encode() as NSDictionary, toFile: url + path)
}
static func create(from path: String) -> Self {
guard let url = Self.directoryURL,
let dict = NSKeyedUnarchiver.unarchiveObject(withFile: url + path) as? [String: AnyObject] else { return self.init() }
return self.init(dict: dict) ?? self.init()
}
}
此协议和扩展旨在简化NSCoding并允许在Struts上使用该协议。然而,当我试图保存对象时,我正在遇到崩溃。
更具体地说,我在
的返回行上遇到了崩溃func save(to path: String) -> Bool {
guard let url = Self.directoryURL else { return false }
return NSKeyedArchiver.archiveRootObject(self.encode() as NSDictionary, toFile: url + path)
}
我觉得它与NSDictionary有关,但我不确定如何继续。
有什么建议吗?
答案 0 :(得分:3)
基金会档案系统(NSCoding
及相关类型)是很久以前在Objective-C中设计和实现的(部分内容超过20年),并期望“对象”成为NSObject
。尝试使用它来编码包含非NSObject
类对象的对象图是完全不现实的。您可能能够简化其在Swift中的使用,但您需要确保归档程序认为是NSObject
的所有内容都实现了NSObject
API的必要部分。由于没有关于归档器使用哪些部分的文档,唯一合理的选择是子类NSObject
。
我当然错了,但你没有向我们展示代码的相关部分(特别是encode
的实现)。
答案 1 :(得分:1)
如果您还没有看到它,Vishal S已经汇总了一篇关于人们可以(当前)在结构中保存数据的不同方式的非常好的文章。
Archiving and Unarchiving Swift Structure Instances
或正如Vishal所说的那样
"斯威夫特引入了巨大的类型安全性。但是,归档和取消归档始终会丢失对象的类型。除非通过支持Swift的所有原则来实现这一目标,否则我们应该利用我们拥有的东西。"
当然(冒着冒犯SO霸主的风险),人们可能会建议Apple Gurus付出一点努力来开发一种保存数据的结构(和类型)友好方式(!)。只是说。 。
并祝你好运。