2010-05-18 79 views
2

我在教自己Objective-C利用一些资源,其中一个是通过iTunes U(过去的2010年级)提供的斯坦福iPhone Dev类。学习目标-C:需要关于填充NSMutableDictionary的建议

其中一项家庭作业任务要求使用预定义的键和值列表(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]); 
     } 

    } 

} 

感谢您的帮助!

回答

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:],像所有的可可工厂方法,创建一个实例那就是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

我也建议使用静态数据的plist(这似乎你有)的。如果你定义了一个plist,你可以用很少的代码直接将它加载到NSDictionary中。

你可以在这里看到它Plist to Dictionary