初认Objective-c NSNumber NSInteger int NSNumber转换

来源:互联网 发布:mac全选照片 编辑:程序博客网 时间:2024/05/18 01:18
    在Objective-c中有int的数据类型,还要用NSNumber?这是因为int不是对象。
NSNumber是数据对象,我们可以使用NSNumber数据对象来创建和初始化不同类型的数字对象。
    #import <Foundation/Foundation.h>            NSNumber *myNumber,*floatNumber,*intNumber,*number1;            //创建integer类型对象      intNumber = [NSNumber numberWithInteger:123];      NSLog(@"%i",[intNumber integerValue]);            //创建long类型对象      myNumber = [NSNumber numberWithLong:0xababab];      NSLog(@"%lx",[myNumber longValue]);            //创建char类型对象      myNumber = [NSNumber numberWithChar:'K'];      NSLog(@"%c",[myNumber charValue]);            //创建float类型对象      floatNumber = [NSNumber numberWithFloat:123.00];      NSLog(@"%f",[floatNumber floatValue]);            //创建double类型对象      myNumber = [NSNumber numberWithDouble:112233e+15];      NSLog(@"%lg",[myNumber doubleValue]);            //判断两个对象的值是否相等      if ([intNumber isEqualToNumber:floatNumber] == YES ) {         NSLog(@"值相等");      } else {         NSLog(@"值不相等");      }            //比较两个对象的值大小      if ( [intNumber compare:myNumber] == NSOrderedAscending) {         NSLog(@"左边的数字小");      } else {         NSLog(@"左边的数字大");      }            //初始化实例      number1 = [[NSNumber alloc] initWithInt:1000];      NSLog(@"%d",[number1 intValueunsigned];      [number1 release];  
   对于每个数字基本类型,类方法都为这它分配了一个NSNumber对象,并将其设置为指定的值,这些方法都是以numberWith开始的,之后是类型,如numberWithLong。

此外,还可以使用实例方法为先前分配的NSNumber对象设定指定的值,这些都是以initWith开头,比如initWithLong。


对于初学者来说,那么问题来了?那么说到int他和NSInteger又有什么区别呢?

在c语言中,int和long的字节数是和操作系统指针所占位数相等。

但c语言中说,long的长度永远大于或等于int

objective-c里,苹果的官方文档中总是推荐用NSInteger

它和int有什么区别呢,stackoverflow这帮大神给了答案。

原来在苹果的api实现中,NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型。

定义的代码类似于下:

 

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

typedef long NSInteger;

typedef unsigned long NSUInteger;

#else

typedef int NSInteger;

typedef unsigned int NSUInteger;

#endif

很简单的总结:那就是NSInteger与int的区别是NSInteger会根据系统的位数(32or64)自动选择int的最大数值(int or long)还有就是他和NSString一样都可以是对象。


最后我们再来扯一扯objective-c中数字型字符串转换NSNumber:

我们首先写个方法如下:

    id result;            NSString * ss;                        ss=@"124";                        result=[NSNumber numberWithFloat:[ss floatValue]];               NSLog(@"%f",[ss floatValue]);            NSLog(@"%f",[result floatValue]);   

直接将NSString类的floatValue方法将ss对象转成float类型,再使用NSNumber的numberWithFloat方法转成NSNumber类型的对象。

但这里有一个问题,如果ss不是@”111.22”,而是@“xxx”,则该方法将报错的。

因此,这里需要一个事先判断,判断ss是不是能转成成NSNumber。

根据这个修改要求,我再将代码转换成这样:

ss=@"224.34129";          NSNumberFormatter *f = [[NSNumberFormatter alloc] init];          if ([f numberFromString:ss])      {          result=[NSNumber numberWithFloat:[ss floatValue]];      }      else      {          result=ss;      }      NSLog(@"%.2f",[result floatValue]);

这样,功能是没有问题了。但看过之后,觉得有点累赘感。

代码简洁点可不可以呢?最终修改成这样几行,如下所示:

ss=@"324.34";     result=[f numberFromString:ss];     if(!(result))     {         result=ss;     }      NSLog(@"%.2f",[result floatValue]); 

测试结果如下: 

2012-08-07 17:35:04.203 apple1[2484] 124.000000

2012-08-07 17:35:04.203 apple1[2484] 124.000000

2012-08-07 17:35:04.203 apple1[2484] 224.34

2012-08-07 17:35:04.203 apple1[2484] 324.34

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 五年级下册数学应用题 三年级上期数学应用题 小学三年级时间应用题 小学二年级数学应用题大全 小学三年级数学应用题上册 六年级工程问题应用题 六年级数学比例应用题 六年级数学工程应用题 五年级鸡兔同笼应用题 10以内的加减法应用题 五年级上册小数除法应用题 小学二年级数学应用题上册 小学三年级上册数学应用题 二年级数学除法应用题 小学二年级除法应用题 二年级下册奥数应用题 七年级数学方程应用题 五年级数学方程应用题 小学数学四年级应用题 小学四年级上册数学应用题 六年级数学方程应用题 二年级上学期数学应用题 小学五年级上册应用题 五年级列方程解应用题 六年级数学分数乘法应用题 三年级上学期数学应用题 小学五年级奥数应用题 小学三年级上册应用题 小学生六年级数学应用题 小学六年级分数乘法应用题 小学六年级上册数学应用题 八年级上册物理应用题 小学二年级数学加减法应用题 应多音字 应组词多音 应多音字组词语组词 应组词多音字 多音字应分别怎么组词 应字组词多音字组词语 应的多音字组词 应的拼音和组词多音