gpt4 book ai didi

ios - valueForKeyPath : @"@max.totalSteps", 的奇怪问题是 iOS 平台代码中的这个错误吗?

转载 作者:行者123 更新时间:2023-11-29 12:36:00 26 4
gpt4 key购买 nike

我花了几个小时来调试这个问题,因此发布这个,以防你有专家建议/线索。

这是问题所在的代码:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"plot" ofType:@"json"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSInteger minSteps = [dict[@"steps"] valueForKeyPath:@"@min.totalSteps"];
NSInteger maxSteps = [dict[@"steps"] valueForKeyPath:@"@max.totalSteps"];
NSLog(@"Min Steps = %@", minSteps);
NSLog(@"Max Steps = %@", maxSteps);

下面提供的 JSON 内容,上面的代码预计会产生 minSteps 为“0”()和 ma​​xSteps 为“710”。

但是上面的代码产生了以下结果。

最小步数 = 0 最大步数 = 90

为什么发现最大值是“90”??

有什么线索吗?

plot.json 文件的内容:

{
steps = (
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 75;
},
{
totalSteps = 184;
},
{
totalSteps = 113;
},
{
totalSteps = 90;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 11;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 386;
},
{
totalSteps = 282;
},
{
totalSteps = 22;
},
{
totalSteps = 42;
},
{
totalSteps = 710;
},
{
totalSteps = 200;
},
{
totalSteps = 0;
},
{
totalSteps = 111;
},
{
totalSteps = 12;
},
{
totalSteps = 0;
},
{
totalSteps = 49;
},
{
totalSteps = 67;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 104;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 55;
}
);
}

为每个请求提供调试器输出:PS:抱歉JSON的长度,有重复,因为这接近实时数据。

(lldb) po dict
{
steps = (
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 75;
},
{
totalSteps = 184;
},
{
totalSteps = 113;
},
{
totalSteps = 90;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 11;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 386;
},
{
totalSteps = 282;
},
{
totalSteps = 22;
},
{
totalSteps = 42;
},
{
totalSteps = 710;
},
{
totalSteps = 200;
},
{
totalSteps = 0;
},
{
totalSteps = 111;
},
{
totalSteps = 12;
},
{
totalSteps = 0;
},
{
totalSteps = 49;
},
{
totalSteps = 67;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 104;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 55;
}
);
}

(lldb) po [dict[@"steps"] valueForKeyPath:@"@min.totalSteps"];
0

(lldb) po [dict[@"steps"] valueForKeyPath:@"@max.totalSteps"];
90

(lldb) po minSteps
0

(lldb) po maxSteps
90

(lldb)

@Matt,再次感谢。我还找到了有效的解决方案:为了其他好处,我提供了运行良好的代码。

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"plot" ofType:@"json"];
NSError *jsonParsingError = nil;
NSMutableDictionary *responseObject = [NSJSONSerialization
JSONObjectWithData:[NSData dataWithContentsOfFile:filePath]
options:NSJSONReadingMutableContainers error:&jsonParsingError];
NSInteger minSteps = [dict[@"steps"] valueForKeyPath:@"@min.totalSteps"];
NSInteger maxSteps = [dict[@"steps"] valueForKeyPath:@"@max.totalSteps"];
NSLog(@"Min Steps = %@", minSteps);
NSLog(@"Max Steps = %@", maxSteps);

但是,请注意,前提是 JSON 结构也不是很正确,需要少量修改才能被 NSJSONSerialization 解析器接受。

这是修改后的可接受格式的文件:

{
“steps” : (
{
“totalSteps” : 0,
},
...

如果你看到这样的问题:

(lldb) po jsonParsingError
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (No string key for value in object around character 6.) UserInfo=0x109875d50 {NSDebugDescription=No string key for value in object around character 6.}

请检查 JSON 格式的有效性。并确保您的文件不是 RTF 格式等...

最佳答案

这是因为当您的文件变成字典时,steps 最终会成为一个字典数组,其中 totalSteps 是键,值是 字符串。从字符串的角度来看,"90" 是最大的(因为它以字母 "9" 开头,在“字母表”比任何其他数字都大;这些数字作为字符,从 “0”“9”)。

那个的原因是您正在以 .plist 的形式读取文件 - 您根本没有以 JSON 的形式读取它。 [NSDictionary dictionaryWithContentsOfFile:filePath] 将文件解释为 .plist。如果您希望将其解释为 JSON,请将其作为 NSData 读取,然后使用 JSON 方法 (NSJSONSerialization) 将其转换为 Cocoa 对象。

不要仅仅因为文件名以“json”结尾就认为该文件将被读取为 JSON。 dictionaryWithContentsOfFile: 只做一件事:它将文件读取为 .plist。你的文件刚上门,因为可以理解为“老式的属性(property) list ”:见https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/PropertyLists/OldStylePlists/OldStylePLists.html#//apple_ref/doc/uid/20001012-BBCBDBJE .旧式属性(property) list 中没有数字;只有字符串。在某种程度上,你很不幸;如果尝试将文件作为属性列表读取失败,那对您来说会更好!但不幸的是,NSDictionary 能够将其解释为旧式属性列表。

关于ios - valueForKeyPath : @"@max.totalSteps", 的奇怪问题是 iOS 平台代码中的这个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26310570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com