【问题标题】:receiving collection element of type int is not an objective c object in iOS接收 int 类型的集合元素不是 iOS 中的目标 c 对象
【发布时间】:2013-12-07 19:05:06
【问题描述】:

我有以下字典:

NSDictionary* jsonDict = @{
                               @"firstName": txtFirstName.text,
                               @"lastName": txtLastName.text,
                               @"email": txtEmailAddress.text,
                               @"password": txtPassword.text,
                               @"imageUrl": imageUrl,
                               @"facebookId": [fbId integerValue],
                              };

在最后一个元素中,我需要使用整数,但收到错误消息:

collection element of type int is not an objective c object

如何在此元素中使用 int 值?

【问题讨论】:

  • @"facebookId" : [fbId integerValue] 应该是 @"facebookId" : @([fbId longLongValue])。然而,在 Swift 中,数字没有强制转换要求:即 let jsonDict = [..., "facebookId" : fbId.longLongValue() ]

标签: ios nsdictionary


【解决方案1】:

应该是:

@"facebookId": [NSNumber numberWithInt:[fbId intValue]];

NSDictionary 仅适用于对象,因此,我们不能简单地存储 ints 或 integers 或 bools 或任何其他原始数据类型。

[fbId integerValue] 返回一个原始整数值(不是对象
因此,我们需要封装 primitive 数据类型并将它们制成对象。这就是为什么我们需要使用像NSNumber 这样的类来创建一个对象来简单地存储这些废话。

更多阅读:http://rypress.com/tutorials/objective-c/data-types/nsnumber.html

【讨论】:

    【解决方案2】:

    假设 fbIDint 那么它应该是这样的:

    @"facebookId": @(fbId)
    

    【讨论】:

      【解决方案3】:

      或者,假设 fbID 是 NSString

      @"facebookId": @([fbId intValue]);
      

      它就像 Java 中的自动装箱。 @ 将任何原始数字转换为 NSNumber 对象。

      【讨论】:

      • 如果fbId 已经是NSNumber,那么它应该是@"facebookId" : fbId, 不清楚是NSString 还是NSNumber,因为两者都有integerValue 方法。
      【解决方案4】:

      NSDictionary 只能保存对象(例如 NSString、NSNumber、NSArray 等),不能保存原始值(例如 int、float、double 等)。 Objective-C 中几乎所有的封装也是如此。要存储数字,请使用 NSNumber:

      NSDictionary *dictionary = @{@"key" : [NSNumber numberWithInt:integerValue]]};
      

      【讨论】:

        【解决方案5】:

        您必须将@(%value%) 用于字典中的非指针数据类型值存储。

        @"facebookId": @(fbId)
        

        【讨论】:

          【解决方案6】:

          我最终使用了NSNumber

          NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
              [f setNumberStyle:NSNumberFormatterDecimalStyle];
              NSNumber * myNumber = [f numberFromString:fbId];
              [f release];
          

          【讨论】:

          • 为什么需要采用如此复杂的方法来解析像 Facebook Id 这样的 BigInt?它只是一个 64 位整数/20 个字符的字符串。您可以轻松地执行 [fbId longLongValue] 将字符串解析为原始数字,然后 @([fbId longLongValue]) 将其转换为 NSNumber
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-28
          • 2012-10-06
          • 2012-07-26
          • 2021-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多