当安全地解码类型为records的属性(例如NSArray )时,通常会这样做:
[decoder decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [ClassOfElementsInArray class], nil] forKey:@"records"];但是,如果所有基类都知道records中的元素符合协议<RecordEntity>,那么您将如何解码<RecordEntity>?有什么最佳做法吗?
更新
我已经使用轻量级泛型@DBoyer's suggestion测试过[NSArray<id<RecordEntity>> class],但不幸的是,这是行不通的。解码时,NSKeyedUnarchiver抛出以下异常,说明只需要NSArray类型的对象。
-[BaseClassTest testDecode] : failed: caught "NSInvalidUnarchiveOperationException", "value for key 'NS.objects' was of unexpected class 'Record'.
Allowed classes are '{(NSArray)}'."发布于 2015-07-19 18:21:14
没有直截了当的办法。Class是指向类的指针,而不是指向协议的指针。即使协议类似于RTE中的类,如果发现的类实现了协议,-isKindOfClass:也不会返回YES。
你可以做两件事:
-decodeArrayOfItemsConformingToProtocol:forKey:。使用现有的解码方法作为模板。我从来没有这样做过,但我认为这不仅仅是一小时的工作。发布于 2015-07-19 15:46:36
如果您使用的是Xcode 7,那么objective的进步使得使用新的“轻量级泛型”功能成为可能:
[decoder decodeObjectOfClass:[NSArray<id<RecordEntity>> class] forKey:@"records"];注:这将编译完全好,但我还没有测试,以确保它读和写完美的磁盘。不过,这将是一个很好的起点。
https://stackoverflow.com/questions/31502931
复制相似问题