iOS-NSDictionary有6个键,显示3个



对于任务跟踪应用程序,我使用了一个nsdictionary数组,其中包含有关任务的某些详细信息——持续时间等。

    NSString *savedTaskName = addedTask.taskName;
    NSString *savedTaskAccountName = addedTask.accountName;
    NSString *savedTaskBillCode = addedTask.billCode;
    NSString *savedTaskActivityCode = addedTask.activityCode;
    NSNumber *savedTaskDuration = [NSNumber numberWithFloat:addedTask.taskDuration];
    NSString *savedTaskTimeCode = addedTask.formattedTimeString;
    NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:savedTaskName, kTaskName,
        savedTaskAccountName, kAccountName, 
        savedTaskBillCode, kBillCode, 
        savedTaskActivityCode, kActivityCode,
        savedTaskDuration, kTaskDuration,
        savedTaskTimeCode, kTimeCode, nil];

也许我犯了一个新的错误,但是当我去添加addedTaskData到NSMutableArray时,数组只捕获字典的前三个值和键。

我疯了吗?为什么它没有完全传染?奇怪的是,请求字典键的计数将返回完整的数量。

initWithObjectsAndKeys在到达nil值时停止。如果您有三个键/值,那么:

NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:savedTaskName, kTaskName,
    savedTaskAccountName, kAccountName, 
    savedTaskBillCode, kBillCode, 
    savedTaskActivityCode, kActivityCode, // <-- THIS IS NIL
    savedTaskDuration, kTaskDuration,
    savedTaskTimeCode, kTimeCode, nil];

你可以这样写:

NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:savedTaskName, kTaskName,
    savedTaskAccountName, kAccountName, 
    savedTaskBillCode, kBillCode, 
    (savedTaskActivityCode ?: [NSNull null]), kActivityCode, // Or @""
    savedTaskDuration, kTaskDuration,
    savedTaskTimeCode, kTimeCode, nil];

任何可能为nil的元素都应该像这样被保护。

如果你在一行中做了很多这样的操作,你可以声明一个局部null变量:

id null = [NSNull null];
NSDictionary *addedTaskData = [[NSDictionary alloc] initWithObjectsAndKeys:(savedTaskName ?: null), kTaskName,
    (savedTaskAccountName ?: null), kAccountName, 
    (savedTaskBillCode ?: null), kBillCode, 
    (savedTaskActivityCode ?: null), kActivityCode, // Or @""
    (savedTaskDuration ?: null), kTaskDuration,
    (savedTaskTimeCode ?: null), kTimeCode, nil];

当不使用文字语法时,有可能会遇到nil终止问题。如果savedTaskDuration实际上是nil,那么它将切断NSDictionary的其余部分。

看看调试器,看看你是否有一个nil值在那里的某个地方。然后运行现代Objective-C重构工具,把那个傻瓜转换成NSDictionary字面量,这样你将来就不会再发生这种情况了。

对于引用,Literal语法如下:

NSDictionary *addedTaskData = @{@"Key" : @"Value", @"AnotherKey" : @"AnotherValue"};

尝试这样使用文字:

NSString *savedTaskName = addedTask.taskName;
    NSString *savedTaskAccountName = addedTask.accountName;
    NSString *savedTaskBillCode = addedTask.billCode;
    NSString *savedTaskActivityCode = addedTask.activityCode;
    NSNumber *savedTaskDuration = [NSNumber numberWithFloat:addedTask.taskDuration];
    NSString *savedTaskTimeCode = addedTask.formattedTimeString;
    // Use literals and see your code doesn't crash
    NSDictionary *addedTaskData = @{kTaskName: savedTaskName, 
                                    kAccountName: savedTaskAccountName,
                                    savedTaskBillCode: savedTaskBillCode,
                                    savedTaskActivityCode: savedTaskActivityCode
                                    savedTaskDuration: savedTaskDuration
                                    savedTaskTimeCode: savedTaskTimeCode};

确保你的代码不会崩溃

最新更新