接收 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
仅适用于对象,因此,我们不能简单地存储 int
s 或 integer
s 或 bool
s 或任何其他原始数据类型。
[fbId integerValue]
返回一个原始整数值(不是对象)
因此,我们需要封装 primitive 数据类型并将它们制成对象。这就是为什么我们需要使用像NSNumber
这样的类来创建一个对象来简单地存储这些废话。
更多阅读:http://rypress.com/tutorials/objective-c/data-types/nsnumber.html
【讨论】:
【参考方案2】:假设 fbID 是 int
那么它应该是这样的:
@"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 对象的主要内容,如果未能解决你的问题,请参考以下文章