Есть ли способ указать конкретный индекс объекта в выражении valueForKeyPath? - PullRequest
1 голос
/ 16 февраля 2012

При вызове NSDictionary valueForKeyPath, если один уровень пути является массивом, вы можете указать определенный элемент в массиве?

Например:

[myDict valueForKeypath:@"customer.contactInfo.phoneNumbers[4].countryCode];

где .phoneNumbers - NSArray,Или я должен:

NSArray *numbers=[myDict valueForKeypath:@"customer.contactInfo.phoneNumbers];
NSString *countryCode=[[numbers objectAtIndex:4] objectForKey:@"countryCode"];

Было бы очень приятно и намного чище, если бы это можно было сделать одним утверждением.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Вы можете сделать это:

NSString *myString = [[[myDict valueForKeypath:@"customer.contactInfo.phoneNumbers"] objectAtIndex:4] objectForKey:@"countryCode"];
0 голосов
/ 12 декабря 2012

Вот категория, которую я написал для NSObject, которая может обрабатывать индексы массива, чтобы вы могли получить доступ к вложенному объекту, например так: "customer.contactInfo.phoneNumbers [4] .countryCode"

@interface NSObject (ValueForKeyPathWithIndexes)
   -(id)valueForKeyPathWithIndexes:(NSString*)fullPath;
@end


#import "NSObject+ValueForKeyPathWithIndexes.h"    
@implementation NSObject (ValueForKeyPathWithIndexes)

-(id)valueForKeyPathWithIndexes:(NSString*)fullPath
{
    //quickly use standard valueForKeyPath if no arrays are found
    if ([fullPath rangeOfString:@"["].location == NSNotFound)
        return [self valueForKeyPath:fullPath];

    NSArray* parts = [fullPath componentsSeparatedByString:@"."];
    id currentObj = self;
    for (NSString* part in parts)
    {
        NSRange range = [part rangeOfString:@"["];
        if (range.location == NSNotFound)           
        {
            currentObj = [currentObj valueForKey:part];
        }
        else
        {
            NSString* arrayKey = [part substringToIndex:range.location];
            int index = [[[part substringToIndex:part.length-1] substringFromIndex:range1.location+1] intValue];
            currentObj = [[currentObj valueForKey:arrayKey] objectAtIndex:index];
        }
    }
    return currentObj;
}
@end

Используйте это так

NSString* countryCode = [myDict valueForKeyPathWithIndexes:@"customer.contactInfo.phoneNumbers[4].countryCode"];

Нет проверки ошибок, поэтому она может быть взломана, но вы поняли. Я перекрестно разместил этот ответ на похожий (связанный) вопрос.

...