初认Objective-c NSNumber NSInteger int NSNumber转换
来源:互联网 发布:mac全选照片 编辑:程序博客网 时间:2024/05/18 01:18
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一样都可以是对象。
我们首先写个方法如下:
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
- 初认Objective-c NSNumber NSInteger int NSNumber转换
- int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber
- Objective-c之NSNumber与int之间的转换
- Objective-c基础 NSNumber与int之间的转换
- IOS int,NSInteger,NSUInteger,NSNumber
- int,NSInteger,NSUInteger,NSNumber区别
- 区分 int,NSInteger,NSUInteger,NSNumber
- objc--int NSUInteger NSInteger NSNumber
- [IOS]int,NSInteger,NSUInteger,NSNumber使用
- ios iphone开发 int,NSInteger,NSUInteger,NSNumber
- int、NSInteger、NSUInteger、NSNumber的关系
- LayoutInflater
- 用XRDP方式远程桌面连接CentOS6(centos7好像不能直接按以下操作)
- 解决no cpu/abi system image available for this target的问题
- 【摘抄】长期通过微博、微信、知乎等平台接收碎片化的知识有什么弊端?
- mysql数据库实现类似oracle connect by prior的查询
- 初认Objective-c NSNumber NSInteger int NSNumber转换
- MFC对话框button控件置灰
- 黑马程序员------进销存管理系统代码节选
- 使用Eclipse中提供的Refactor(重构)工具
- lua调用syslog; 使用C注册lua方法
- json对象在java和javascript中的遍历
- fh admin bootstrap 模版下载 框架 源码 SpringMVC mybatis or hibernate
- Verilog同步FIFO
- C语言:存取结构体成员的点运算符(.)和箭头运算符(->)的区别