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

标签 ios objective-c json nsdictionary

NSDictionary 让我很困惑。它有点像我收集到的结构和数组的混合体。我正在阅读 iOS 编程书,它让我们将一个 JSON 对象放入 NSDictionary 中。对于返回键为“titles”的对象来说,一切都很好,但是对于 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 值,否则它不会执行任何操作? 显然 upcoming.start_date 不是这样做的方法! 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";
    }
);

最佳答案

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

}

请注意,以上不是任何特定的语言或语法,只是数据“结构”的表示。

要检索类(class)详细信息,您可以像访问任何其他对象一样访问“即将到来的”对象并将其分配给变量。

假设 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];
}

关于ios - 如何在成员之间保持链接的同时访问 NSDictionary 的另一个成员中的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750571/

相关文章:

objective-c - NSTask 终止处理程序仅在我发送 waitUntilExit 时运行

ios - 删除时间戳和进程 ID

objective-c - 从上下文中删除托管对象而不是从一对多关系 NSSet 中删除托管对象是否安全

javascript - 在 AngularJS 中更新 JSON 文件

android - 如何将Json数据存入Sqlite?

ios - 检查 viewDidLoad 上的 UISwitch 状态

ios - 在uitableviewcell中异步加载图像

ios - UserDefaults 中的值仅在重新启动后出现

ios - 定义一个变量为AnyObject,以便以后可以更改为NSTimer--Swift

python - 嵌套在 Nest Json 模型中到 SQL 表