Цель обучения C: нужен совет по заполнению NSMutableDictionary - PullRequest
2 голосов
/ 18 мая 2010

Я учу себя Objective-C, используя ряд ресурсов, одним из которых является класс iPhone для Стэнфорда, доступный через iTunes U (в прошлом классе 2010).

Одно из заданий на домашнюю работу попросило меня заполнить изменяемый словарь предопределенным списком ключей и значений (URL). Я смог собрать код вместе, но, глядя на него, я продолжаю думать, что, возможно, есть гораздо лучший способ приблизиться к тому, что я пытаюсь сделать:

  1. Заполните NSMutableDictionary предопределенными ключами и значениями
  2. Перечислите по ключам словаря и проверьте каждый ключ, чтобы увидеть, начинается ли он с "Stanford"
  3. Если он соответствует критериям, записать ключ и значение

Буду очень признателен за любые отзывы о том, как я могу улучшить то, что я собрал. Я само определение начинающего, но я действительно наслаждаюсь проблемой изучения Objective-C.

void bookmarkDictionary () {
    NSMutableDictionary* bookmarks = [NSMutableDictionary dictionary];

    NSString* one = @"Stanford University",
    *two = @"Apple",
    *three = @"CS193P",
    *four = @"Stanford on iTunes U",
    *five = @"Stanford Mall";

    NSString* urlOne = @"http://www.stanford.edu",
    *urlTwo = @"http://www.apple.com",
    *urlThree = @"http://cs193p.stanford.edu",
    *urlFour = @"http://itunes.stanford.edu",
    *urlFive = @"http://stanfordshop.com";

    NSURL* oneURL = [NSURL URLWithString:urlOne];
    NSURL* twoURL = [NSURL URLWithString:urlTwo];
    NSURL* threeURL = [NSURL URLWithString:urlThree];
    NSURL* fourURL = [NSURL URLWithString:urlFour];
    NSURL* fiveURL = [NSURL URLWithString:urlFive];

    [bookmarks setObject:oneURL forKey:one];
    [bookmarks setObject:twoURL forKey:two];
    [bookmarks setObject:threeURL forKey:three];
    [bookmarks setObject:fourURL forKey:four];
    [bookmarks setObject:fiveURL forKey:five];

    NSString* akey;
    NSString* testString = @"Stanford";

    for (akey in bookmarks) {

        if ([akey hasPrefix:testString]) {
            NSLog(@"Key: %@     URL: %@", akey, [bookmarks objectForKey:akey]);
        }

    }

}

Спасибо за вашу помощь!

Ответы [ 2 ]

5 голосов
/ 18 мая 2010

Ваш код выглядит правильно, и вы правы, считая, что есть лучший способ. Вы можете уменьшить количество временных переменных и использовать (не изменяемый) NSDictionary вместо NSMutableDictionary, выбрав инициализатор для задачи:

NSDictionary *bookmarks = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSURL urlWithString:@"http://www.stanford.edu"], @"Stanford University",
                             [NSURL urlWithString:@"http://www.apple.com"], @"Apple",
                             //...etc...,
                             nil
                          ];

Обратите внимание, что -[NSDictionary dictionaryWithObjectsAndKeys:], как и все фабричные методы Какао, создает экземпляр autoreleased. Если вы намереваетесь сохранить право собственности на словарь после текущей области, вам следует retain возвращенный экземпляр или использовать alloc/initWithObjectsAndKeys:.

Если для назначения (как ни странно) требуется изменяемый словарь, вы, конечно, можете использовать +[NSMutableDictionary dictionaryWithObjectsAndKeys:].

Я предпочитаю более явную форму поиска, которую вы используете. Некоторые могут подумать, что (если вы на 10.6), лучше использовать более функциональную форму:

[bookmarks enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
        if([key hasPrefix:testString]) { NSLog(@"Key: %@  URL: %@", key, value); }
    }];
2 голосов
/ 19 мая 2010

Я бы также порекомендовал использовать plist для статических данных (которые у вас, похоже, есть). Если вы определили plist, вы можете загрузить его непосредственно в NSDictionary с очень небольшим кодом.

Вы можете прочитать об этом здесь Plist to Dictionary

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...