返回具有特定属性的对象

时间:2013-04-29 13:13:05

标签: iphone ios objective-c xcode

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

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

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

[_app.windows objectAtIndex:index];

相反,我需要这样的东西:

伪码:

[_app.windows objectWithIdent:ident];

我怎么能做到这一点?

4 个答案:

答案 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];