如何在成员之间保持链接的同时访问NSDictionary的另一个成员中的成员

时间:2014-03-30 22:14:12

标签: ios objective-c json nsdictionary

NSDictionary让我困惑。它有点像我收集的结构和数组的混合。我正在阅读iOS编程书,它让我们将一个JSON对象放入NSDictionary。对于具有键"标题"的对象,一切都很好。返回,但对于upcoming类,upcoming内有变量。在我看来,这就是NSDictionary的构建方式。

struct classes {
    NSString *title;
    struct upcoming[] {
        NSString *end_date;
        NSString *start_date;
        NSString *instructor;
        }
    }
}

我一直试图通过使用以下变体检索start_date循环中的for

NSLog(@"%@", [course objectForKey:@"upcoming.start_date"]);

我这样做的目的是在titleupcoming个类中附加start_date个字符串,并附加NSString *value = course[@"title"]; if ([course objectForKey@"upcoming"] [value stringByAppendingString: @" course[@"upcoming.start_date"]; NSLog(@"%@", value); 个字符串。有点像...

upcoming

如何制作它以便如果upcoming.start_date有一个或多个值,那么它会显示那些start_date值,方法是附加显示ELSE的字符串,它不会做任何事情?显然start_date不是这样做的!并且title本身没有指向相关NSString *title = [course objectForKey:@"title"]; NSArray *upcomingCourses = [course objectForKey:@"upcoming"]; if (upcomingCourses.count > 0 NSString *showDate = [NSString stringWithFormat:@"%@. Next Class Date: %@" title, [[upcomingCourses objectAtIndex:0] objectForKey:@"start_date"]]; NSLog(@"%@", showDate); } else NSLog(@"%@", title); 的链接。我需要将它们连接起来以附加相应的字符串。

解决方案:

NSDictionary

NSLog发布courses = ( { title = "Advanced iOS Bootcamp"; upcoming = ( { "end_date" = "2014-04-04"; instructors = Blocksom; location = "BNR West, California"; "start_date" = "2014-03-31"; }, { "end_date" = "2014-05-16"; instructors = Dalrymple; location = "BNR West, California"; "start_date" = "2014-05-12"; }, { "end_date" = "2014-06-20"; instructors = Ward; location = "Atlanta, Georgia"; "start_date" = "2014-06-16"; } ); url = "https://training.bignerdranch.com/classes/advanced-ios-bootcamp"; }, { title = "Beginning iOS (iPhone/iPad)"; upcoming = ( { "end_date" = "2014-04-18"; instructors = Mathias; location = "BNR West, California"; "start_date" = "2014-04-12"; }, { "end_date" = "2014-05-02"; instructors = "Keur, Ward"; location = "Atlanta, Georgia"; "start_date" = "2014-04-26"; }, { "end_date" = "2014-05-23"; instructors = Christopher; location = "Atlanta, Georgia"; "start_date" = "2014-05-17"; }, { "end_date" = "2014-06-06"; instructors = Christopher; location = "BNR West, California"; "start_date" = "2014-05-31"; }, { "end_date" = "2014-07-25"; instructors = Ritchie; location = "BNR West, California"; "start_date" = "2014-07-19"; }, { "end_date" = "2014-08-01"; instructors = "Usiyan, Keur"; location = "Atlanta, Georgia"; "start_date" = "2014-07-26"; }, { "end_date" = "2014-09-19"; instructors = Ritchie; location = "BNR West, California"; "start_date" = "2014-09-13"; } ); url = "https://training.bignerdranch.com/classes/beginning-ios"; }, { title = "Mobile Design Bootcamp"; upcoming = ( { "end_date" = "2014-06-13"; instructors = "Harper, Porter"; location = "BNR West, California"; "start_date" = "2014-06-09"; } ); url = "https://training.bignerdranch.com/classes/mobile-design-bootcamp"; }, { title = "Python Programming"; upcoming = ( { "end_date" = "2014-04-24"; instructors = Cassell; location = "Atlanta, Georgia"; "start_date" = "2014-04-21"; }, { "end_date" = "2014-06-19"; instructors = Cassell; location = "BNR West, California"; "start_date" = "2014-06-16"; } ); url = "https://training.bignerdranch.com/classes/python-programming"; }, { title = "Beginning iOS Game Development"; upcoming = ( { "end_date" = "2014-06-20"; instructors = Strougo; location = "BNR West, California"; "start_date" = "2014-06-16"; }, { "end_date" = "2014-09-26"; instructors = Strougo; location = "BNR West, California"; "start_date" = "2014-09-22"; } ); url = "https://training.bignerdranch.com/classes/beginning-ios-game-development"; }, { title = "Android Bootcamp"; upcoming = ( { "end_date" = "2014-05-16"; instructors = Phillips; location = "Atlanta, Georgia"; "start_date" = "2014-05-12"; }, { "end_date" = "2014-06-20"; instructors = Marsicano; location = "Atlanta, Georgia"; "start_date" = "2014-06-16"; }, { "end_date" = "2014-07-11"; instructors = Stewart; location = "BNR West, California"; "start_date" = "2014-07-07"; }, { "end_date" = "2014-10-03"; instructors = Phillips; location = "BNR West, California"; "start_date" = "2014-09-29"; } ); url = "https://training.bignerdranch.com/classes/android-bootcamp"; }, { title = "HTML5 Apps with jQuery"; upcoming = ( { "end_date" = "2014-05-16"; instructors = Aquino; location = "Atlanta, Georgia"; "start_date" = "2014-05-12"; }, { "end_date" = "2014-06-13"; instructors = Gandee; location = "Atlanta, Georgia"; "start_date" = "2014-06-09"; }, { "end_date" = "2014-08-01"; instructors = Aquino; location = "BNR West, California"; "start_date" = "2014-07-28"; } ); url = "https://training.bignerdranch.com/classes/html5-apps-with-jquery"; }, { title = "Ruby on the Server"; upcoming = ( { "end_date" = "2014-06-13"; instructors = Stewart; location = "Atlanta, Georgia"; "start_date" = "2014-06-09"; } ); url = "https://training.bignerdranch.com/classes/ruby-on-the-server"; }, { title = "iOS Bootcamp - Fast Track"; upcoming = ( { "end_date" = "2014-07-11"; instructors = Usiyan; location = "Atlanta, Georgia"; "start_date" = "2014-07-07"; } ); url = "https://training.bignerdranch.com/classes/ios-bootcamp-fast-track"; }, { title = "Cocoa I Bootcamp"; upcoming = ( { "end_date" = "2014-07-25"; instructors = Preble; location = "Atlanta, Georgia"; "start_date" = "2014-07-21"; } ); url = "https://training.bignerdranch.com/classes/cocoa-i-bootcamp"; }, { title = "OpenGL ES Bootcamp"; upcoming = ( { "end_date" = "2014-07-25"; instructors = Blocksom; location = "Atlanta, Georgia"; "start_date" = "2014-07-21"; } ); url = "https://training.bignerdranch.com/classes/opengl-es-bootcamp"; } );

{{1}}

}

1 个答案:

答案 0 :(得分:3)

NSDictionary允许您按键检索对象。密钥只是另一个对象,但通常使用NSStrings(限制是密钥必须是唯一的,值不需要)。任何对象都可以存储在密钥下,因此在您的情况下即将到来的'是一组NSDictionaries。所以你得到了

dictionary {
   title: someString
   upcoming: array {
       0: dictionary {
          end_date: somestring
          start_date: someString
          instructor: someString
       }
       1: dictionary {
          end_date: somestring
          start_date: someString
          instructor: someString
       }
   }

}

请注意,上述内容并非任何特定的语言或语法,只是“结构”的表示形式。你的数据。

要检索课程详情,您可以访问"即将发布的"对象就像任何其他对象一样,并将其分配给变量。

假设course是您的根NSDictionary

NSString *title=(NSString *)[course objectForKey:@"title"];
NSArray *upcomingCourses=(NSArray *)[course objectForKey:@"upcoming"];

NSMutableString *startDates=[[NSMutablestring alloc]init];

for (int i=0;i<[upcomingCourses count];i++)
{  
    NSDictionary *upcomingCourse = (NSDictionary *)[upcomingCourses objectAtIndex:i];
    NSString *startDate = (NSString *)[upcomingCourse objectForKey:@"start_date"];
    NSString *endDate = (NSString *)[upcomingCourse objectForKey:@"end_date"];
    NSString *instructor = (NSString *)[upcomingCourse objectForKey:@"instructor"];

    [startDates appendFormat:@"%@, ",startDate];
}