学习Objective-C:需要有关填充NSMutableDictionary的建议

Zig*_*ers 2 objective-c

我正在使用一些资源自学Objective-C,其中一个是通过iTunes U(2010年过去的课程)提供的Stanford iPhone Dev课程.

其中一项家庭工作任务要求我使用预定义的键和值列表(URL)填充可变字典.我能够将代码放在一起,但是当我看到它时,我一直认为可能有更好的方法让我接近我想要做的事情:

  1. 使用预定义的键和值填充NSMutableDictionary
  2. 枚举字典中的键并检查每个键,看它是否以"斯坦福"开头
  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]);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Bar*_*ark 5

您的代码看似正确,您认为有更好的方法是正确的.您可以减少临时变量的数量,并使用(非可变)NSDictionary而不是NSMutableDictionary通过为任务选择初始化程序:

NSDictionary *bookmarks = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSURL urlWithString:@"http://www.stanford.edu"], @"Stanford University",
                             [NSURL urlWithString:@"http://www.apple.com"], @"Apple",
                             //...etc...,
                             nil
                          ];
Run Code Online (Sandbox Code Playgroud)

请注意-[NSDictionary dictionaryWithObjectsAndKeys:],与所有Cocoa工厂方法一样,创建一个实例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); }
    }];
Run Code Online (Sandbox Code Playgroud)