我真正喜欢的Java的一个特性是自动装箱,其中编译器自动在基元和它们的包装类之间进行转换.
我正在Objective-C/Cocoa中编写一个Core Data应用程序,我发现以编程方式处理我的整数属性令人沮丧.原因如下:
//img is a managed object that I have fetched
NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];
Run Code Online (Sandbox Code Playgroud)
如果我碰巧忘记了intValue我有时会做的消息,那么传递给stringWithFormat:它的int 实际上就是指针值.
问题是这种情况完全无声地发生 - 没有编译器错误或警告.有时我会花太多时间调试这个愚蠢,愚蠢的问题.
有没有办法改变我的编程风格或我的编译器设置,以防止我陷入陷阱?
编辑:我不清楚上面这个例子只是我遇到麻烦的地方之一.这是另一个与字符串无关的假设示例:
实体CollegeClass有两个整数属性:courseNumber和enrollmentLimit.假设我想比较课程编号:
//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
NSLog(@"undergraduate class");
}
Run Code Online (Sandbox Code Playgroud)
或者类似地,假设我想计算CS部门中所有课程的平均注册限制.
好吧,这绝对没有意义:
我创建了一个NSNumber:
NSNumber *n = [NSNumber numberWithInt:37669178];
Run Code Online (Sandbox Code Playgroud)
然后我将值作为整数和浮点回显:
int i = [n intValue];
float f = [n floatValue];
Run Code Online (Sandbox Code Playgroud)
以下是他们的价值观:
int: 37669178
float: 37669176.000000
Run Code Online (Sandbox Code Playgroud)
咦!?!?!
有人可以向我解释为什么会发生这种情况以及如何解决这个问题.这肯定不是一个精确的问题.37,669,178完全在浮子的精度范围内.
谢谢,
道格
好的,现在我完全糊涂了.参考math.h
#define MAXFLOAT ((float)3.40282346638528860e+38)
Run Code Online (Sandbox Code Playgroud)
整数值37669178是3.7669178e + 7,完全在允许的最大浮点值范围内.所以,[n floatValue]应该返回37669178.0 而不是 37669176.0
我在这里错过了什么?
我有一个项目,可以进行多项网络操作.为了便于控制,我给每个操作一个唯一的Id,定义为NSNumber,因为我必须使用对象和Array执行操作,这样更容易:
#define LOGIN_OPERATION [NSNumber numberWithInt:0]
#define REGISTER_USER_OPERATION [NSNumber numberWithInt:1]
#define VERIFY_USER_OPERATION [NSNumber numberWithInt:2]
#define REGISTER_USER_DATA_OPERATION [NSNumber numberWithInt:3]
#define FORGOT_PASSWORD_OPERATION [NSNumber numberWithInt:4]
#define PASSTIME_REGISTER_OPERATION [NSNumber numberWithInt:5]
#define PASSTIME_VERIFY_TOKEN_OPERATION [NSNumber numberWithInt:6]
#define PASSTIME_OPERATION [NSNumber numberWithInt:7]
#define SERVICES_OPERATION [NSNumber numberWithInt:8]
#define MAIL_SUPPORT_OPERATION [NSNumber numberWithInt:9]
#define UPDATE_USER_INFO_OPERATION [NSNumber numberWithInt:10]
#define OBTAIN_CACS_OPERATION [NSNumber numberWithInt:11]
#define GET_PREPAID_BALANCE_OPERATION [NSNumber numberWithInt:12]
#define UPDATE_SERVICES_OPERATION [NSNumber numberWithInt:13]
Run Code Online (Sandbox Code Playgroud)
然后我简单地在我的项目说明中使用了以下内容,这在去年一直很好用.
- (void) processNetworkResponseForOperation: (NSNumber*) opId {
if (opId == SERVICES_OPERATION) {
//do something
} else if (opId == UPDATE_SERVICES_OPERATION) {
//do something …Run Code Online (Sandbox Code Playgroud) 我有一个方法,从NSNumber创建一个钱样式字符串.
+ (NSString *)formatShortPayment: (NSNumber *)payment {
if (![payment isEqual: [NSNull null]]) {
// Set locale to GB
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setLocale: locale];
[formatter setNumberStyle: NSNumberFormatterCurrencyStyle];
// If the payment is 1000 or over, get rid of fraction numbers
if ([payment doubleValue] >= 1000.0) {
[formatter setMaximumFractionDigits: 0];
payment = [NSNumber numberWithFloat:([payment floatValue] / 1000)];
}
else {
// Here's where I want to check if the value ends with …Run Code Online (Sandbox Code Playgroud) 我有以下代码行
NSNumber *myValue = loadTempValue*0.420;
Run Code Online (Sandbox Code Playgroud)
我试图将 的值设置*myValue为 的值loadTempValue*0.420,
但是,我收到错误
Invalid operands to binary expression ('NSNumber *" and 'double')
有人可以建议如何设置吗?
我在 .h 文件中有一个 @property opacity
@property (assign) NSNumber *opacity;
Run Code Online (Sandbox Code Playgroud)
然后在 .m 文件中我
@synthesize opacity;
Run Code Online (Sandbox Code Playgroud)
然后在
- (id)initWithFrame:(NSRect)frame
Run Code Online (Sandbox Code Playgroud)
我做了
opacity = [NSNumber numberWithFloat:1.0];
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,Xcode 显示此错误
Thread 1: EXC_BAD_ACCESS (code-EXC_I386_GPFLT)
Run Code Online (Sandbox Code Playgroud)
但是,如果我将该行更改为
opacity = [NSNumber numberWithInteger:1];
Run Code Online (Sandbox Code Playgroud)
一切正常。
我在NSMutableDictionary中有以下值 - 请参阅图像

我试图得到"a"因此:
let a = dictionary.objectForKey("a") as! String
Run Code Online (Sandbox Code Playgroud)
应用程序此时崩溃了
无法将'__NSCFNumber'(0x ...)类型的值转换为'NSString'(0x ...).
""内的其他数字被视为字符串,因为字符串之外的数字被转换为字符串而没有任何问题.
任何人都可以让我知道发生了什么事吗?以及如何轻松获得这些价值?
我有一个enum这样的定义:
typedef enum dataTypes{
LOW,
MEDIUM,
HIGH,
MAX_DATA_TYPE
} dataTypeEnum;
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样实例化一个NSArrayof :NSNumber
NSArray * numsToUse = @[@LOW, @MEDIUM];
Run Code Online (Sandbox Code Playgroud)
这不是编译。有什么见解吗?我是否必须[NSNumber numberWithInt:]为每一个都选择笨重的东西,还是有办法解决这个问题?#define(我出于多种原因考虑并拒绝了这些陈述)。
我正在提出一个HTTP请求,我必须在其中发送一个bool值。我试过他们两个。
两者都以相同的方式工作。我很困惑哪个更好?他们之间有什么区别吗?
if let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as? String{
currentUser = User(name: snapshot.value["name"] as! String ,phoneNumber: snapshot.value["phoneNumber"] as! String, userId: userID , isOnline: snapshot.value["isOnline"] as! Bool, key: "", lastName: snapshot.value["lastName"] as! String, photoUrl: "")
}
Run Code Online (Sandbox Code Playgroud)
我使用Firebase作为MBaas并且我在currentUser线上得到这个错误,奇怪的是这不会一直发生,但有时只有当我离开应用程序(主页按钮)或重新进入它时...
感谢您的时间.
nsnumber ×10
objective-c ×7
ios ×5
iphone ×2
nsstring ×2
swift ×2
autoboxing ×1
boolean ×1
casting ×1
cocoa ×1
cocoa-touch ×1
enums ×1
expression ×1
firebase ×1
http ×1
java ×1
operands ×1