使用NSCoder对数组进行编码

时间:2017-02-11 06:08:17

标签: ios arrays swift nsobject nscoder

我有一个用户Class,只要应用程序终止,它就会使用saveuser()方法。用户有两个Arrays个自定义Classes子类NSObject。这是我的编码方法。

func encode(with aCoder: NSCoder) {
    aCoder.encode(self.firstName, forKey: coderKey.fName)
    aCoder.encode(self.lastName, forKey: coderKey.lName)
    aCoder.encode(self.bio, forKey: coderKey.bio)
    aCoder.encode(self.tags, forKey: coderKey.tags)
    aCoder.encode(self.organizations, forKey: coderKey.orgs)
    aCoder.encode(self.img, forKey: coderKey.img)
}

应用程序在编码self.tags时崩溃。我假设它会对self.organizations执行相同的操作,因为它也是array的{​​{1}},可能还有NSObjects,因为它是self.img。这是我得到的错误。

  

由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [Social_Justice.Tag encodeWithCoder:]:无法识别的选择器发送到实例0x60000005efc0'

我该怎么做才能解决这个问题?如果您需要查看更多代码,请发表评论并进行编辑。

2 个答案:

答案 0 :(得分:0)

正如David Berry在原帖上所评论的那样。您必须确保您尝试编码的任何自定义类也符合NSCoder。他们不需要拥有存档路径,他们只需要具有编码和解码功能。

答案 1 :(得分:0)

<强>答案:

  1. 我假设数组self.tag s 中的对象的类名和self.organization s 标记, <强>组织

  2. Objective-C使用一种非常不同的函数调用样式。如果你看到[ClassName/ObjectName methodName]在某种程度上等同于Swift中的ObjectName.function()样式,那么让我们暂时用这种方式(Swift编译器将来会更好,希望你会调试时不再看到objctive-C警告)

  3. 选择器是Objective-C使用的术语,您可以认为这是一种方法。因此,此无法识别的选择器错误警告会告诉您代码尝试调用名为encodeWithCode()的方法,该方法实际上并不存在于对象标记组织中( NSCoder系统知道如何编码数组,但不知道在Array中编码自己的对象)

  4. 如果要在对象上使用NSCoder系统的5个具体类,则必须符合NSCoding协议。这意味着班级(标记组织)必须实施init?(coder: NSCoder)func encode(with: NSCoder)

  5. NSCoder的4个具体类别为NSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.

  6. 进一步阅读:

    NSCoding / NSKeyed​Archiver By NSHipster

    或者:(我最喜欢的)

    Apple Document NSCoder

    Apple Document NSKeyedArchiver

    Apple Document NSCoding

    或者:(如​​果这些文件对您来说仍然有点混淆)

    Hollemans M。 2016,iOS Apprentice第五版教程2核对表,第126页〜第137页