【问题标题】:Retrieve object from NSArray by specifying class name通过指定类名从 NSArray 中检索对象
【发布时间】: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"] 

难道不应该有更简洁的方法来检索具有指定类名的对象吗..?

【问题讨论】:

  • 取决于你想做什么。数组是一个排序列表,当前实现返回第一个匹配项。当然可能还有更多。它可以基于带有谓词过滤器的集合来完成,但这将返回所有匹配项的子集或子数组。你总是在寻找第一场比赛还是全部?
  • 任何匹配(如代码示例中所示)都可以 - 干杯
  • 在这种情况下,我认为您的实现适合目的。我认为创建和解析谓词很可能比上述方法慢得多,至少对于合理大小的数组(几百个对象)而言。

标签: objective-c cocoa nsarray nsobject


【解决方案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;
}

【讨论】:

  • 你能解释一下这应该如何更简洁..?
  • 但是,您正在将对象数组转换为对象的类名数组。因此,为此,您将跳过该部分。您只是发送一个原始数组并传递一种您想要返回的对象。休息它也在做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多