我有一个名为app
的对象,它包含一个名为windows
的NSMutableArray,在这个数组中有所有window
类型的对象。 window对象获得了一个名为ident
的属性类型,因此我可以像这样访问它们:
for (Window *window in _app.windows){
NSLog(@"%@", window.ident);
}
我正在为此代码寻找替代方法:
[_app.windows objectAtIndex:index];
相反,我需要这样的东西:
伪码:
[_app.windows objectWithIdent:ident];
我怎么能做到这一点?
答案 0 :(得分:1)
最简单的方法是创建一个快速帮助器:
- (Window *)windowWithIdent:(NSString *)ident
{
for (Window *window in _app.windows) {
if ([window.ident isEqualToString:ident]) {
return window;
}
}
return nil;
}
对于更通用的解决方案,您可以在NSArray
上创建一个类别方法:
@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"];
}];
答案 1 :(得分:0)
使用KVC:
[_app.windows valueForKeyPath:@"[collect].{ident == %@", @"5"];
我可能错误的谓词格式,但你可以阅读这个方法。
另一种选择是建立一个字典。
答案 2 :(得分:0)
使用NSPredicate:
NSArray *result = [app.windows filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ident == %@", @"someIdentifier"]];
if (result.count > 0)
{
//Success
}
else
{
//No result
}
答案 3 :(得分:0)
我建议使用Windows的NSMutableDictionary而不是Windows的NSMutableArray。
然后,您可以使用Windows填充字典并将ident
设置为关键字。
有了这个,你可以得到这样的窗口:
[_app.windows objectForKey:ident];
您可以使用以下窗口填充字典:
[_app.windows setObject:someWindow forKey:someUniqueIdent];