Ios Swift 3-无需从NSObject继承的NSCoding
从NSKeyedArchiver获取崩溃信息Ios Swift 3-无需从NSObject继承的NSCoding,ios,objective-c,swift,nscoding,Ios,Objective C,Swift,Nscoding,从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.M
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:]
我创建了一个称为编码的协议,其全部目的是简化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有关,但我不确定如何继续
《基础档案系统》(<代码> NSCODE> <代码>及相关类型)是在Objy-C中长期设计并实现的(20年以上的部分),预期“对象”是“代码> NSbOuts</代码>的实例。尝试使用它对包含非类NSObject对象的对象图进行编码是不现实的。您可以在Swift中简化它的使用,但是您需要确保archiver认为是
NSObject
的所有内容都实现了NSObject
API的必要部分。由于没有文档说明归档员使用了哪些部分,唯一明智的选择是将NSObject
子类化
当然,我可能错了,但是您没有向我们展示代码的相关部分(特别是
encode
)的实现。如果您没有看到,Vishal S已经编写了一篇非常好的文章,介绍了(目前)在结构中保存数据的不同方法
或者像维沙说的那样
“斯威夫特引入了大量的类型安全性。但是,归档和取消归档总是会丢失对象的类型。除非有更好的方法支持斯威夫特的所有原则来实现这一点,否则我们应该好好利用我们现有的。”
当然(冒着得罪所谓霸主的风险),有人可能会建议苹果专家花点精力开发一种结构(类型)友好的数据保存方法(!)。只是说
祝协议好运。您可以尝试让您的类在中实现“归档”下的所有函数,但实际上,
NSCoding
与NSObject
紧密耦合,为什么NSObject不好?目标是允许对结构进行归档。如果必须使用NSObject,这是不可能的。这并不是真正使用NSCoding,只是使用NSKEYEDARCHIVERT的原理。这是我的问题。协议工作正常,但我的编码实现有问题。我没有正确地抄写字典。谢谢