0

我有一个名为的对象app,它包含一个名为 NSMutableArray的对象windows,并且在这个数组中有所有类型的对象window。window 对象有一个名为的属性类型ident,因此我可以像这样访问它们:

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

我正在寻找此代码的替代方法:

[_app.windows objectAtIndex:index];

相反,我需要类似的东西:

伪代码:

[_app.windows objectWithIdent:ident];

我怎样才能做到这一点?

4

4 回答 4

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"];
}];
于 2013-04-29T13:46:53.373 回答
0

Use KVC:

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

I may be wrong with the predicate format, but you can read about this method.

The other option, is to build a dictionary.

于 2013-04-29T13:17:07.830 回答
0

Using NSPredicate:

NSArray *result = [app.windows filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ident == %@", @"someIdentifier"]];
if (result.count > 0)
{
//Success
}
else
{
//No result
}
于 2013-04-29T13:17:12.910 回答
0

我建议使用窗口的 NSMutableDictionary 而不是窗口的 NSMutableArray。

然后,您可以用 windows 填充您的 Dictionary 并将您的设置ident为键。

有了这个,你可以得到你的窗口是这样的:

[_app.windows objectForKey:ident];

您可以使用如下窗口填充字典:

[_app.windows setObject:someWindow forKey:someUniqueIdent];
于 2013-04-29T13:18:31.950 回答