通过指定类名从 NSArray 中检索对象
Posted
技术标签:
【中文标题】通过指定类名从 NSArray 中检索对象【英文标题】:Retrieve object from NSArray by specifying class name 【发布时间】:2016-02-14 08:10:44 【问题描述】:任务:
从NSArray
返回一个对象,该对象是类的实例,其名称作为函数的参数给出。
现在我有这个功能:
+ (id)objectOfType:(NSString *)name fromArray:(NSArray *)array
for (NSObject* instance in array)
if ([instance.className isEqualToString:name])
return instance;
return nil;
但是,假设我可以通过NSArray
上的这个简单方法调用将对象数组转换为对象的类名数组
[array valueForKeyPath:@"className"]
难道不应该有更简洁的方法来检索具有指定类名的对象吗..?
【问题讨论】:
取决于你想做什么。数组是一个排序列表,当前实现返回第一个匹配项。当然可能还有更多。它可以基于带有谓词过滤器的集合来完成,但这将返回所有匹配项的子集或子数组。你总是在寻找第一场比赛还是全部? 任何匹配(如代码示例中所示)都可以 - 干杯 在这种情况下,我认为您的实现适合目的。我认为创建和解析谓词很可能比上述方法慢得多,至少对于合理大小的数组(几百个对象)而言。 【参考方案1】:这是一个简洁的方法,使用NSPredicate
和数组过滤。
+ (id)objectOfType:(NSString *)name fromArray:(NSArray *)array
return [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"class == %@", NSClassFromString(name)]].lastObject;
【讨论】:
我想这会是一个很好的类别,以非常简洁的方式解决任务 - 干杯!【参考方案2】:这样做的另一种方法是您可能拥有原始对象数组。您可以将要检索的类型的对象传递给下面给出的方法:
*array 是原始对象数组:
+ (id)objectOfType:(id)passingObject fromArray:(NSArray *)array
for (id obj in array)
if ([obj isKindOfClass:[passingObject class]])
return obj;
return nil;
【讨论】:
你能解释一下这应该如何更简洁..? 但是,您正在将对象数组转换为对象的类名数组。因此,为此,您将跳过该部分。您只是发送一个原始数组并传递一种您想要返回的对象。休息它也在做同样的事情。以上是关于通过指定类名从 NSArray 中检索对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSArray 从 iOS 上的可转换核心数据创建对象