![](/img/trans.png)
[英]Swift: NSCoding Implementation For An Object Without Instance Variables
[英]Swift 3 - NSCoding without the annoyance of inheriting from NSObject
从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有关,但是我不确定如何进行。
有什么建议么??
Foundation归档系统( NSCoding
和相关类型)是很早以前就在Objective-C中设计并实现的(部分历史已超过20年),并且期望“对象”是NSObject
实例。 试图使用它对包含非NSObject
类对象的对象图进行编码根本不现实。 您可能可以简化它在Swift中的使用,但是您需要确保存档者认为的所有对象都是NSObject
实现NSObject
API的必要部分。 由于没有关于归档程序使用哪些部分的文档,唯一明智的选择是将NSObject
子类化。
我当然可能错了,但是您没有向我们展示代码的相关部分(特别是encode
的实现)。
万一您看不到它,Vishal S撰写了一篇非常不错的文章,介绍了可以(当前)将数据保存在结构中的不同方式。
或正如维沙尔所说的
“ Swift引入了大量的类型安全性。但是,归档和取消归档总是会丢失对象的类型。在通过支持Swift的所有原理来实现这一目标的更好方法之前,我们应该利用已有的东西。”
当然,(冒犯SO霸主的风险)可能表明Apple Gurus投入了一些精力来开发一种结构(和类型)友好的方式来保存数据(!)。 只是说。 。 。
祝协议顺利。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.