首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用符合协议(NSSecureCoding)的元素安全地解码NSSecureCoding

使用符合协议(NSSecureCoding)的元素安全地解码NSSecureCoding
EN

Stack Overflow用户
提问于 2015-07-19 15:40:37
回答 2查看 553关注 0票数 0

当安全地解码类型为records的属性(例如NSArray )时,通常会这样做:

代码语言:javascript
复制
[decoder decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [ClassOfElementsInArray class], nil] forKey:@"records"];

但是,如果所有基类都知道records中的元素符合协议<RecordEntity>,那么您将如何解码<RecordEntity>?有什么最佳做法吗?

更新

我已经使用轻量级泛型@DBoyer's suggestion测试过[NSArray<id<RecordEntity>> class],但不幸的是,这是行不通的。解码时,NSKeyedUnarchiver抛出以下异常,说明只需要NSArray类型的对象。

代码语言:javascript
复制
-[BaseClassTest testDecode] : failed: caught "NSInvalidUnarchiveOperationException", "value for key 'NS.objects' was of unexpected class 'Record'. 
Allowed classes are '{(NSArray)}'."
EN

回答 2

Stack Overflow用户

发布于 2015-07-19 18:21:14

没有直截了当的办法。Class是指向类的指针,而不是指向协议的指针。即使协议类似于RTE中的类,如果发现的类实现了协议,-isKindOfClass:也不会返回YES

你可以做两件事:

  1. 编写一个方法-decodeArrayOfItemsConformingToProtocol:forKey:。使用现有的解码方法作为模板。我从来没有这样做过,但我认为这不仅仅是一小时的工作。
  2. 使用RTE找出哪些类符合协议,并将其作为允许类的列表。
票数 0
EN

Stack Overflow用户

发布于 2015-07-19 15:46:36

如果您使用的是Xcode 7,那么objective的进步使得使用新的“轻量级泛型”功能成为可能:

代码语言:javascript
复制
[decoder decodeObjectOfClass:[NSArray<id<RecordEntity>> class] forKey:@"records"];

注:这将编译完全好,但我还没有测试,以确保它读和写完美的磁盘。不过,这将是一个很好的起点。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31502931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档