标签: nsnumber

当我想要intValue时,如何防止自己意外使用NSNumber的指针?

我真正喜欢的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有两个整数属性:courseNumberenrollmentLimit.假设我想比较课程编号:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}
Run Code Online (Sandbox Code Playgroud)

或者类似地,假设我想计算CS部门中所有课程的平均注册限制.

java autoboxing cocoa objective-c nsnumber

2
推荐指数
1
解决办法
295
查看次数

可可触摸.为什么NSNumber返回intValue和floatValue的差值?

好吧,这绝对没有意义:

我创建了一个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完全在浮子的精度范围内.

谢谢,
道格

UPDATE

好的,现在我完全糊涂了.参考math.h

#define MAXFLOAT    ((float)3.40282346638528860e+38)
Run Code Online (Sandbox Code Playgroud)

整数值37669178是3.7669178e + 7,完全在允许的最大浮点值范围内.所以,[n floatValue]应该返回37669178.0 而不是 37669176.0

我在这里错过了什么?

cocoa-touch objective-c nsnumber

2
推荐指数
1
解决办法
1025
查看次数

Iphone sdk - 比较NSNumber时的奇怪行为

我有一个项目,可以进行多项网络操作.为了便于控制,我给每个操作一个唯一的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)

iphone objective-c nsnumber operator-keyword ios

2
推荐指数
1
解决办法
475
查看次数

检查NSNumber是否有.00位数

我有一个方法,从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)

iphone objective-c nsnumber nsnumberformatter ios

2
推荐指数
1
解决办法
1027
查看次数

iOS NSNumber 对二进制表达式的无效操作数(NSNumber *" 和 'double')

我有以下代码行

NSNumber *myValue = loadTempValue*0.420;
Run Code Online (Sandbox Code Playgroud)

我试图将 的值设置*myValue为 的值loadTempValue*0.420

但是,我收到错误

Invalid operands to binary expression ('NSNumber *" and 'double')

有人可以建议如何设置吗?

expression nsnumber operands ios

2
推荐指数
1
解决办法
5899
查看次数

NSNumber 导致应用程序崩溃

我在 .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)

一切正常。

objective-c nsnumber

2
推荐指数
1
解决办法
568
查看次数

NSMutableDictionary将NSString值视为NSNumber

我在NSMutableDictionary中有以下值 - 请参阅图像

在此输入图像描述

我试图得到"a"因此:

let a = dictionary.objectForKey("a") as! String
Run Code Online (Sandbox Code Playgroud)

应用程序此时崩溃了

无法将'__NSCFNumber'(0x ...)类型的值转换为'NSString'(0x ...).

""内的其他数字被视为字符串,因为字符串之外的数字被转换为字符串而没有任何问题.

任何人都可以让我知道发生了什么事吗?以及如何轻松获得这些价值?

nsnumber nsstring nsmutabledictionary ios swift

2
推荐指数
1
解决办法
4725
查看次数

使用枚举时无法使用简写 @n 类型语法实例化 NSNumber?

我有一个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(我出于多种原因考虑并拒绝了这些陈述)。

enums objective-c nsnumber objective-c-literals

2
推荐指数
1
解决办法
193
查看次数

@(YES) vs [NSNumber numberWithBool:YES]

我正在提出一个HTTP请求,我必须在其中发送一个bool值。我试过他们两个。

两者都以相同的方式工作。我很困惑哪个更好?他们之间有什么区别吗?

boolean http objective-c nsnumber ios

2
推荐指数
1
解决办法
2210
查看次数

无法将'Swift._NSContiguousString'类型的值转换为'NSNumber

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线上得到这个错误,奇怪的是这不会一直发生,但有时只有当我离开应用程序(主页按钮)或重新进入它时...
感谢您的时间.

casting nsnumber nsstring firebase swift

2
推荐指数
2
解决办法
4700
查看次数