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

时间:2010-05-18 16:38:59

标签: objective-c

我正在教自己Objective-C利用大量资源,其中一个是通过iTunes U(2010年过去的课程)提供的斯坦福iPhone开发课程。

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

  1. 使用预定义的键和值填充NSMutableDictionary
  2. 列举字典中的键并检查每个键以查看它是否以“Stanford”开头
  3. 如果符合条件,请同时记录密钥和值
  4. 我真的很感激有关如何改进我所放在一起的任何反馈。我是初学者的定义,但我真的很享受学习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 个答案:

答案 0 :(得分:5)

您的代码看似正确,您认为有更好的方法是正确的。您可以减少临时变量的数量,并通过为任务选择初始值设定项来使用(不可变的)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:]与所有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); }
    }];

答案 1 :(得分:2)

我还建议使用plist来获取静态数据(看起来你有)。如果您定义了一个plist,则可以使用非常少的代码将其直接加载到NSDictionary中。

您可以在此处阅读Plist to Dictionary