8 Stimmen

Erreichen der tiefsten Kinderebene im NSDictionary

Ich habe ein NSDictionary-Objekt mit tiefen Strukturen in es wie Arrays, die weitere Array enthalten, die Dictionaries enthalten...

Ich möchte ein Objekt in der Hierarchie nach unten holen. Gibt es eine direkte Indizierung Weg, um sie mit Schlüsselnamen oder etwas anderes abrufen?

Es ist mühsam, die objectForKey-Methode mehrfach aufzurufen, um die tiefste Child-Ebene zu erreichen.

8voto

Caleb Punkte 121906

Wenn Sie nur Wörterbücher verwenden und die Schlüssel in Ihren Wörterbüchern immer Zeichenketten sind, können Sie Schlüssel-Wert-Codierung um mehrere Ebenen von Wörterbüchern zu durchlaufen:

id someObject = [mainDictionary valueForKey:@"apple.pear.orange.bear"];

Dies ist gleichbedeutend mit:

NSDictionary *level2Dict = [mainDictionary objectForKey:@"apple"];
NSDictionary *level3Dict = [level2Dict objectForKey:@"pear"];
NSDictionary *level4Dict = [level3Dict objectForKey:@"orange"];
id someObject = [level4Dict objectForKey:@"bear"];

Dies ist jedoch nicht so praktisch, wenn Sie auch Arrays in der Mischung haben. Siehe diese jüngste SO-Diskussion für weitere Informationen zu diesem Thema.

4voto

coneybeare Punkte 32926

Für eine Struktur, die Arrays enthält, gibt es keine eingebaute Möglichkeit, etwas wie zu tun:

[dict objectForKey:@"[level1][level2][level3]"]

Abgesehen davon ist alles, was eingebaut ist, nur Code, den jemand bei Apple geschrieben hat, und Sie können das Gleiche tun.

Schreiben Sie eine Hilfsklasse, die dies für Sie auf der Grundlage eines von Ihnen erstellten Schemas für die Schlüsselverkettung erledigt, und rufen Sie sie dann einfach auf. So sparen Sie sich die Code-Duplikation.

3voto

Li-chih Wu Punkte 954
//
//  NSDictionary+Path.h
//
//  Created by Wu Li-chih on 10/3/12.
//  Copyright (c) 2012 Wu Li-chih. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSDictionary (Path)
- (id) objectForPath:(NSArray*)aKeyPath;
@end

//
//  NSDictionary+Path.m
//
//  Created by Wu Li-chih on 10/3/12.
//  Copyright (c) 2012 Wu Li-chih. All rights reserved.
//

#import "NSDictionary+Path.h"

@implementation NSDictionary (Path)

- (id) objectForPath:(NSArray*)aKeyPath
{
    if([d isKindOfClass:[NSDictionary class]])
        d = [d objectForKey:aKey];
    else if([d isKindOfClass:[NSArray class]])
        d = [d objectAtIndex:[aKey integerValue]];
    else
        return nil;
    if(d == nil)
        return nil;
}

@end

// example
id v = [dict objectForPath:@[@"root", @"sub", @"target_node"]];

NSDictionary *a = @{ @"aaa" : @{ @"bbb": @[@123, @456, @{@"ccc": @"result"}]}};
id r = [a objectForPath:@[@"aaa", @"bbb", @2, @"ccc"]];
STAssertTrue([r isEqualToString:@"result"], nil);
r = [a objectForPath:@[@"aaa", @"bbb", @0, @"ccc"]];
STAssertNil(r, nil);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X