将 NSNumber 转换为 long

Posted

技术标签:

【中文标题】将 NSNumber 转换为 long【英文标题】:Convert NSNumber to long 【发布时间】:2018-04-05 07:41:12 【问题描述】:

我正在尝试 但我收到此错误:

[__NSSingleObjectArrayI intValue]: 无法识别的选择器发送到 实例

这是我的代码:

NSNumber *dbversion = [settings valueForKey:@"Version"];
long dbver = [dbversion longValue];

我在这里做错了什么?

*settings 是一个 NSArray,“Version”是长值的键。

【问题讨论】:

您检查过[settings valueForKey:@"Version"] 实际返回的值吗? 是的,是__NSSingleObjectArrayI 【参考方案1】:

你陷入了键值编码陷阱。

在某些情况下,valueForKey 的结果是错误消息明确指出的数组。

不要永远不要使用valueForKey(除非你知道KVC做什么并且你需要KVC),使用密钥订阅。

由于settings 是一个数组,您可能会得到第一项

NSNumber *dbversion = settings[0][@"Version"];

int 不是long

long dbver = [dbversion longValue];

但是在 64 位机器上,我建议使用 NSInteger

NSInteger dbver = dbversion.integerValue;

【讨论】:

我可能会更进一步:作者似乎正在首次亮相(错误是明确的,并且对于经验丰富的开发人员来说是众所周知的)。对于新人,我建议永远不要使用valueForKey:,结果可能会误导他们未来的使用。 当我使用你写的第一行代码时出现错误:Expected method to read dictionary element not found on object of type 'NSArray settings 是一个 NSArray 对象 那么你的语法无论如何都是错误的。数组由索引下标,例如settings[0] 你能打印settings吗? @vadian 对其结构进行了猜测,他的回答是合法的,但可能不足以完全满足您当前的情况,您可能需要调整或使用settings,以便他可以调整其答案。【参考方案2】:

//我认为您正在将字符串从字典“设置”存储到 NSNumber,因此它会显示您提到的错误。 请尝试解决方案。希望对您有所帮助。

NSNumber *dbversion = [NSNumber numberWithLong:[[settings valueForKey:@"Version"] longLongValue]];
int dbver = [dbversion longValue];

【讨论】:

你能提到 NSLog(@"%@", [settings valueForKey:@"Version"] ); ? 如另一个答案中所述,请勿使用valueForKey

以上是关于将 NSNumber 转换为 long的主要内容,如果未能解决你的问题,请参考以下文章

将 NSString 转换为 NSNumber 精度问题

如何将 NSNumber 转换为 NSString

如何将 NSString 转换为 NSNumber

将 JSON ARRAY 转换为 NSNumber 数组

将核心数据中的 NSNumber 转换为 NSString

将 NSString 转换为 NSNumber 会导致数字过多和奇怪的舍入