接收 int 类型的集合元素不是 iOS 中的目标 c 对象

Posted

技术标签:

【中文标题】接收 int 类型的集合元素不是 iOS 中的目标 c 对象【英文标题】:receiving collection element of type int is not an objective c object in iOS 【发布时间】: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() ] 【参考方案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

以上是关于接收 int 类型的集合元素不是 iOS 中的目标 c 对象的主要内容,如果未能解决你的问题,请参考以下文章

set 集合

python--基础数据类型 set集合

集合(set)

集合(set)

快速整明白Redis中的整数集合到底是个啥

python - 深浅拷贝