我正在教自己Objective-C利用大量资源,其中一个是通过iTunes U(2010年过去的课程)提供的斯坦福iPhone开发课程。
其中一项家庭工作任务要求我使用预定义的密钥和值(URL)列表填充可变字典。我能够将代码放在一起,但是当我看到它时,我一直认为可能有更好的方法让我接近我想要做的事情:
我真的很感激有关如何改进我所放在一起的任何反馈。我是初学者的定义,但我真的很享受学习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]);
}
}
}
感谢您的帮助!
答案 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