安全地解码records
类型的属性(例如NSArray
)时,通常会这样做:
[decoder decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [ClassOfElementsInArray class], nil] forKey:@"records"];
但是,如果所有基类知道records
中的元素是否符合协议records
,您将如何解码<RecordEntity>
?有没有最好的做法?
更新
我使用轻量级泛型[NSArray<id<RecordEntity>> class]
对@DBoyer's suggestion进行了测试,但不幸的是,这并不起作用。解码时,NSKeyedUnarchiver
抛出以下异常,表示只需要NSArray
类型的对象。
-[BaseClassTest testDecode] : failed: caught "NSInvalidUnarchiveOperationException", "value for key 'NS.objects' was of unexpected class 'Record'.
Allowed classes are '{(NSArray)}'."
答案 0 :(得分:0)
没有直接转发的方式。 Class
是指向类的指针,而不是指向协议的指针。即使协议类似于RTE内的类,如果找到的类实现协议,-isKindOfClass:
也不会返回YES
。
你可以做两件事:
编写方法-decodeArrayOfItemsConformingToProtocol:forKey:
。使用现有的decode-methods作为模板。我从来没有这样做,但我认为这不仅仅是一小时的工作。
使用RTE查找哪些类符合协议,并将其作为允许类的列表。
答案 1 :(得分:-1)
如果您正在使用Xcode 7,Objective-C的进步可以使用新的“轻量级通用”功能实现这一目标:
[decoder decodeObjectOfClass:[NSArray<id<RecordEntity>> class] forKey:@"records"];
注意:这将完全编译,但我没有测试,以确保它完美地读取和写入磁盘。这将是一个开始的好地方。