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

Posted

技术标签:

【中文标题】如何在保持成员之间的链接的同时访问 NSDictionary 的另一个成员中的成员【英文标题】:How do I access a member inside another member of NSDictionary while keeping a link between members 【发布时间】:2014-03-30 22:14:11 【问题描述】:

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

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

我一直在尝试使用以下变体在for 循环中检索start_date

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

我这样做的目的是将title 的字符串附加在upcoming 类中具有值的start_date。比如……

NSString *value = course[@"title"];
if ([course objectForKey@"upcoming"] [value stringByAppendingString:
                                         @" course[@"upcoming.start_date"];
NSLog(@"%@", value);

我该如何做到,如果upcoming 有一个或多个值,那么它将通过附加显示的字符串来显示这些 start_date 值,否则它不会做任何事情?显然@ 987654336@不是办法!而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); 

NSLog发布NSDictionary

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";
    
);

【问题讨论】:

NSDictionaryset(不重复)键和值集合之间的映射。根据您熟悉的其他语言,您可能将其结构称为“associative array”、“哈希表”或“映射”。每个键对应一个值;它们是成对的,并且这些对是无序的。 你能把你的字典的实际构造或布局放入问题中吗?通过NSLog() 打印出来就可以了。 @JoshCaswell 已更新。好长啊! 在您做任何其他事情之前,请访问 json.org 并学习 JSON 语法。只需5-10分钟。虽然 Java 人喜欢通过将其直接映射到结构来使其过于复杂,但实际上,最好将其设想为数组和字典(哈希表)的“树”。 (如果你想用 Objective-C 去任何地方,你需要非常熟悉 NSArray 和 NSDictionary,因为它们处理应用程序中大约 80% 的数据。) 请注意,在上面的转储中,最外层的“层”(由() 字符括起来)是一个NSArray,下一层(由 字符括起来)是一个NSDictionary,然后在字典里面是几个字符串和另一个数组(又是()),它又包含更多的字典。该方案的美妙之处在于,您可以仅使用这两个简单对象(NSArray 和 NSDictionary)来表示相对任意结构的数据结构。这也是 JSON 的美妙之处,因为它的“数组”和“对象”很好地映射到了 Objective-C 结构。 【参考方案1】:

NSDictionary 允许您通过键检索对象。键只是另一个对象,但通常使用 NSString(限制是键必须是唯一的,值不需要是唯一的)。任何对象都可以存储在键下,因此在您的情况下,“即将到来”是一个 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];

【讨论】:

你能告诉我一些粗略的语法如何将它添加到for 循环中吗?也许我需要将对象添加到数组中以链接它们? 对不起,我错过了即将到来的是一个数组 - 让我修改我的答案 嗯,我想我需要回去重新学习 NSDictionary。我根本不处理这个。我仍然期待看到类似if (objectKey@"title" hasNonNullObject: objectKey@"upcoming") doSomething(); 的东西我无法想象这将如何连接字符串。 即将到来的总是有一个对象 - 一个数组 - 该数组可能有 0 个条目。我的答案中的 for 循环处理这种情况,因为 count 将为 0 并且 0 不 它显示了我希望它显示的内容,我仍在使用代码来理解它,但你给了我很大的推动力,朝着正确的方向发展。谢谢!

以上是关于如何在保持成员之间的链接的同时访问 NSDictionary 的另一个成员中的成员的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 React SPA 中访问路由组件,同时保持正确的 CSP?

如何共享 DynamoDB 表以在组织的其他成员之间保持透明?

使WKWebView在后台保持不变,同时显示另一个视图

如何在保持在另一列范围内的同时锻炼列中两个值之间的差异?

核心数据:如何在两个 NSManagedObjectContext 之间合并插入/更新/删除,同时将合并保持为可撤消的步骤?

如何创建一个同时支持横向和纵向但不在它们之间旋转的视图控制器(保持其初始方向)