Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift 3-无需从NSObject继承的NSCoding_Ios_Objective C_Swift_Nscoding - Fatal编程技术网

Ios Swift 3-无需从NSObject继承的NSCoding

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

从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:]
我创建了一个称为编码的协议,其全部目的是简化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的原理。这是我的问题。协议工作正常,但我的编码实现有问题。我没有正确地抄写字典。谢谢