2013-04-29 42 views
0

我收到了一個名爲app的對象,其中包含一個名爲windows的NSMutableArray,並且在此數組中存在window類型的所有對象。 window對象有一個屬性類型名爲ident這樣我就可以訪問他們像這樣:返回具有某個屬性的對象

for (Window *window in _app.windows){ 
    NSLog(@"%@", window.ident); 
} 

我在尋找一種替代的方式爲這個代碼:

[_app.windows objectAtIndex:index]; 

相反,我需要這樣的東西:

僞代碼:

[_app.windows objectWithIdent:ident]; 

我該怎麼做到這一點?

+0

創建window'代替陣列的'一個字典。然後你可以使用'[_app.windows objectForKey:ident];' – 2013-04-29 13:16:47

+0

在你的for循環中用一個if替換NSLog([ident isEqual:window.ident]) – Marc 2013-04-29 13:20:28

+0

@Anoop Vaidya我仍然需要能夠擁有所有數組functionallity,因爲我已經在我的整個程序中使用這個數組作爲 – nonuma 2013-04-29 13:21:56

回答

1

要做的就是創建一個快捷幫助最簡單的事情:

- (Window *)windowWithIdent:(NSString *)ident 
{ 
    for (Window *window in _app.windows) { 
     if ([window.ident isEqualToString:ident]) { 
      return window; 
     } 
    } 

    return nil; 
} 

對於更一般的解決方案,您可以在上創建類別方法:

@implementation NSArray (MyAdditions) 
    - (id)firstObjectMatchingBlockPredicate:(BOOL (^)(id object))block 
    { 
     for (id o in self) { 
      if (block(o)) { 
       return o; 
      } 
     } 

     return nil; 
    } 
@end 

然後

[_app.windows firstObjectMatchingBlockPredicate:^BOOL(Window *w) { 
    return [w.ident isEqualToString:@"ident"]; 
}]; 
+0

感謝兄弟做了這個訣竅 – nonuma 2013-04-29 13:58:17

+0

只記得這是O(n)查找時間,所以如果你的數組中有大量的窗口,你可能想用其他更有效的方法來做到這一點。 – 2013-04-29 14:00:24

+0

什麼是大數? – nonuma 2013-04-29 14:04:11

0

使用KVC:

[_app.windows valueForKeyPath:@"[collect].{ident == %@", @"5"]; 

我可能是錯的謂語形式,但是你可以看到這個方法。

另一種選擇是建立一個字典。

+0

這是什麼「ident == 5」? – nonuma 2013-04-29 13:20:18

+0

已編輯。這實際上是查詢。 5只是一個例子。 – 2013-04-29 13:22:00

+0

***由於未捕獲異常'NSUnknownKeyException',原因:'[ valueForUndefinedKey:]終止應用程序:此類不是密鑰編碼兼容的密鑰[collect]。' – nonuma 2013-04-29 13:33:53

0

使用NSPredicate:

NSArray *result = [app.windows filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ident == %@", @"someIdentifier"]]; 
if (result.count > 0) 
{ 
//Success 
} 
else 
{ 
//No result 
} 
0

我會建議使用Windows而不是Windows的NSMutableArray中的的NSMutableDictionary。

然後,您可以填寫您的字典與Windows並將您的ident作爲關鍵。

有了這個,你可以得到你的窗口是這樣的:

[_app.windows objectForKey:ident]; 

您可以填寫字典,像這樣的窗口:

[_app.windows setObject:someWindow forKey:someUniqueIdent]; 
相關問題