繁体   English   中英

Swift 3-NSCoding无需从NSObject继承的烦恼

[英]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的协议,其全部目的是简化NSCodingNSKeyedArchiver,而无需使用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引入了大量的类型安全性。但是,归档和取消归档总是会丢失对象的类型。在通过支持Swift的所有原理来实现这一目标的更好方法之前,我们应该利用已有的东西。”

当然,(冒犯SO霸主的风险)可能表明Apple Gurus投入了一些精力来开发一种结构(和类型)友好的方式来保存数据(!)。 只是说。

祝协议顺利。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM