0

という名前のオブジェクトを取得しました。appこれには、という名前の NSMutableArray が含まれています。windowsこの配列には、タイプ のすべてのオブジェクトがあります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

KVC を使用:

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

述語の形式が間違っているかもしれませんが、このメソッドについて読むことができます。

もう 1 つのオプションは、辞書を作成することです。

于 2013-04-29T13:17:07.830 に答える
0

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

Windows の NSMutableArray の代わりに、Windows の NSMutableDictionary を使用することをお勧めします。

次に、辞書をウィンドウで埋めてident、キーとして設定できます。

これにより、次のようなウィンドウを取得できます。

[_app.windows objectForKey:ident];

次のようなウィンドウで辞書を埋めることができます。

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