2016-02-14 31 views
0

任務:通過指定類名稱檢索NSArray的對象

返回從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"] 
變換對象的數組對象的類名稱的數組這個簡單的方法調用

不應該有一個更簡潔的方式來檢索具有指定類名稱的對象..?

+0

取決於你想要做什麼。數組是一個排序列表,當前實現返回第一個匹配。當然可以有更多。它可以基於具有謂詞過濾器的集合來完成,但會返回所有匹配的子集或子集。你總是在尋找第一場比賽還是全部? – pco494

+0

任何匹配(如在代碼示例中)會 - 歡呼 – ATV

+1

在這種情況下,我認爲您的實現適合於目的。我認爲創建和解析謂詞很可能比上述方法慢得多,至少對於合理大小的數組(幾百個對象)來說。 – pco494

回答

2

這裏是一個簡潔的方法,使用NSPredicate和陣列過濾。

+ (id)objectOfType:(NSString *)name fromArray:(NSArray *)array { 
    return [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"class == %@", NSClassFromString(name)]].lastObject; 
} 
+0

我想這會讓一個很好的類別以一種非常簡潔的方式解決任務 - 乾杯! – ATV

-1

這樣做的另一種方法是你可能有對象的原始數組。你可以通過你想要檢索下面給出的方法類型的對象:

*數組是原始對象的數組:

+ (id)objectOfType:(id)passingObject fromArray:(NSArray *)array 
{ 
    for (id obj in array) 
    { 
     if ([obj isKindOfClass:[passingObject class]]) 
      return obj; 
    } 
    return nil; 
} 
+0

你能解釋一下這應該是更簡潔嗎? – ATV

+0

但是,您正在將對象數組轉換爲對象的類名稱數組。所以對此你跳過了這部分。您只需發送一個原始數組並傳遞想要返回的對象類型。休息是這樣做的。 –