【问题标题】:Storing long long values in Objective-C在 Objective-C 中存储 long long 值
【发布时间】:2010-10-15 04:31:08
【问题描述】:

我正在使用一个返回 JSON 字典的 API。其中一个键是“Variant Hash”,对应的数据是这样的整数:-7331108254952843887 或 6209894088655053576。我假设这是一个 long long 值。我正在使用 NSCoder 序列化这些数据,但我不确定要使用哪个 encodeValue: 方法。没有 encodeLongLongValue:forKey:。

另外,NSLog(@"%@",returnedDictionary); 会显示整个字典结构,但使用 objectForKey: 不起作用,因为键 Variant Hash 的对应值不是对象。

如何从字典中获取数据,我应该如何使用 NSCoder 存储这些数据?

【问题讨论】:

  • 你使用的是什么 JSON 解析器?
  • 这是我通过谷歌找到的一个库,叫SBJSON

标签: iphone objective-c xcode


【解决方案1】:

没有encodeLongLongValue:forKey:

不,但是有一个 encodeInt64:forKey: 应该可以解决问题。

【讨论】:

  • 你能解释一下int64和long long的相关性吗?合法的问题。您如何了解类型转换的工作原理? NSCoder 文档中没有明确说明,我很偏执,想确定一下。
  • int64_t 和 unsigned long long 都是 64 位整数。您可以在它们之间进行类型转换。 int64_t 是有符号的,但它存储的数据量与 unsigned long long 相同(本质上只是 uint64_t 的 typedef)。如果您将 unsigned long long 的值保存到 int64_t 中,然后返回到 unsigned long long 中,它将与您开始使用的值相同。我在一分钟前自己测试过,但如果你是偏执狂,请在 Xcode 中验证。
【解决方案2】:

根据您使用的 JSON 解析器,数字将作为 NSNumber、NSDecimalNumber、NSString 或 NSValue 存储在字典中。 NSNumber(或 NSDecimalNumber,它是一个子类)可能是最有可能的,但我会检查您的解析器的文档或代码。

假设是这样,你会得到这样的价值。

NSNumber *numberValue = [myDictionary objectForKey:myKey];
long long longValue = [numberValue longLongValue];

为了安全起见,我可能会在这段代码中实现一些类型检查。

NSNumber 符合 NSCoding,因此您可以使用 numberValue 实例来进行编码。

【讨论】:

  • 将值编码到磁盘,然后重新加载后,数字会发生变化。它从正确的 19 位数字变为甚至不在同一个球场中的 10 位整数。有些数字是有符号的,有些是无符号的,但它们的长度总是 19 位。这可能是什么原因造成的?快把我逼疯了
  • 如果你改用 NSDecimalNumber 会怎样?它专为更大的数字而设计。您也可以在下面尝试 Jeremy 的建议。
【解决方案3】:

如果速度不是您最关心的问题,只需将其视为字符串并使用NSString*

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多