2010-05-18 4 views
2

Je m'enseigne moi-même Objective-C en utilisant un certain nombre de ressources, dont l'un est la classe Stanford iPhone Dev disponible via iTunes U (classe 2010 passé).Objectif d'apprentissage-C: Besoin de conseils sur le remplissage NSMutableDictionary

L'une des tâches de travail à domicile m'a demandé de remplir un dictionnaire modifiable avec une liste prédéfinie de clés et de valeurs (URL). Je suis en mesure de mettre le code ensemble, mais comme je le regarde, je continue à penser qu'il ya probablement une bien meilleure façon pour moi d'aborder ce que je suis en train de faire:

  1. Peupler un NSMutableDictionary avec le prédéfini clés et les valeurs
  2. Énumérer à travers les clés du dictionnaire et vérifiez chaque touche pour voir si elle commence par « Stanford »
  3. Si elle répond aux critères, connectez-vous la clé et la valeur

Je voudrais J'apprécie vraiment tout commentaire sur la façon dont je pourrais améliorer ce que j'ai mis ensemble. Je suis la définition même d'un débutant, mais j'apprécie vraiment le défi d'apprendre Objectif-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]); 
     } 

    } 

} 

Merci pour votre aide!

Répondre

5

Votre code semble correct et vous avez raison de penser qu'il existe un meilleur moyen. Vous pouvez réduire le nombre de variables temporaires et utiliser une (non-mutables) NSDictionary au lieu d'un NSMutableDictionary en choisissant un initialiseur pour la tâche:

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

Notez que -[NSDictionary dictionaryWithObjectsAndKeys:], comme toutes les méthodes d'usine de cacao, crée une instance c'est autoreleased. Si vous avez l'intention de conserver la propriété du dictionnaire après la portée actuelle, vous devez indiquer retain l'instance renvoyée ou utiliser alloc/initWithObjectsAndKeys:.

Si l'affectation (bizarrement) requiert un dictionnaire modifiable, vous pouvez bien sûr utiliser +[NSMutableDictionary dictionaryWithObjectsAndKeys:]. Il se trouve que je préfère la forme plus explicite de la recherche que vous utilisez. Certains pensent peut-être (si vous êtes sur 10.6), en utilisant une forme plus fonctionnelle est mieux:

[bookmarks enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { 
     if([key hasPrefix:testString]) { NSLog(@"Key: %@ URL: %@", key, value); } 
    }]; 
2

je recommande également l'utilisation d'un plist pour les données statiques (ce qui vous semble avoir). Si vous définissez un plist, vous pouvez le charger directement dans un NSDictionary avec très peu de code.

Vous pouvez en savoir plus ici Plist to Dictionary

Questions connexes