通过指定类名从 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 中检索对象的主要内容,如果未能解决你的问题,请参考以下文章

从 UIViewController 传递 NSArray

使用 NSArray 从 iOS 上的可转换核心数据创建对象

如何从自定义类中检索 NSArray

IOS/Objective-C:从完成块中检索 NSArray

检索所有 NSTreeController 的对象

从 Firebase 检索和读取数据作为 NSArray (Swift 3)