![](/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.