OC中NSNumber和NSValue

本文此内容参考书籍《Objective-C编程全解(第三版)》【日】荻原刚 著

Cocoa Foundation框架中的集合类只能放入对象,不能存储基本数据类型。我们知道,可以把基本数据类型转换成对象来存储。如果使用字符串格式化和创建自定义对象就显得过于变扭。因为Cocoa Foundation框架就提供了两个类来解决这一问题,这两个类就是NSNumber和NSValue。

##一、NSNumber NSNumber可以用来包装char、int、long等基本数据类型,使其可以放入集合类中。

#生成和初始化方法
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder ;
- (NSNumber *)initWithChar:(char)value;
- (NSNumber *)initWithUnsignedChar:(unsigned char)value ;
- (NSNumber *)initWithShort:(short)value;
- (NSNumber *)initWithUnsignedShort:(unsigned short)value ;
- (NSNumber *)initWithInt:(int)value ;
- (NSNumber *)initWithUnsignedInt:(unsigned int)value ;
- (NSNumber *)initWithLong:(long)value ;
- (NSNumber *)initWithUnsignedLong:(unsigned long)value ;
- (NSNumber *)initWithLongLong:(long long)value ;
- (NSNumber *)initWithUnsignedLongLong:(unsigned long long)value;
- (NSNumber *)initWithFloat:(float)value ;
- (NSNumber *)initWithDouble:(double)value ;
- (NSNumber *)initWithBool:(BOOL)value ;
- (NSNumber *)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
- (NSNumber *)initWithUnsignedInteger:(NSUInteger)value;
复制代码
#类方法,便利构造器
+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
+ (NSNumber *)numberWithShort:(short)value;
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
+ (NSNumber *)numberWithLong:(long)value;
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
+ (NSNumber *)numberWithLongLong:(long long)value;
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)value ;
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value ;
复制代码

还提供了相应的属性,用起来太方便了。获取NSNumber中的值使用大点调用或者它的getter方法即可。

@property (readonly) char charValue;
@property (readonly) unsigned char unsignedCharValue;
@property (readonly) short shortValue;
@property (readonly) unsigned short unsignedShortValue;
@property (readonly) int intValue;
@property (readonly) unsigned int unsignedIntValue;
@property (readonly) long longValue;
@property (readonly) unsigned long unsignedLongValue;
@property (readonly) long long longLongValue;
@property (readonly) unsigned long long unsignedLongLongValue;
@property (readonly) float floatValue;
@property (readonly) double doubleValue;
@property (readonly) BOOL boolValue;
@property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
@property (readonly) NSUInteger unsignedIntegerValue NS_AVAILABLE(10_5, 2_0);
复制代码

我们还会在头文件中看到这样一个属性

@property (readonly, copy) NSString *stringValue;
复制代码

这个可不是用来封装字符串的,它返回的是NSNumber的字符串表示形式。NSNumber也可以进行比较

- (BOOL)isEqualToNumber:(NSNumber *)number;
- (NSString *)descriptionWithLocale:(nullable id)locale;
复制代码

##二、NSValue NSValue 是NSNumber的父类,可以把任意类型包装成对象。像结构体指针这些复杂的数据类型NSNumber无法封装的,可以使用NSValue来封装。

#类方法,构造器
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
+ (NSValue *)valueWithEdgeInsets:(NSEdgeInsets)insets ;
+ (NSValue *)valueWithCATransform3D:(CATransform3D)t;
+ (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;
复制代码
#属性
@property (readonly) NSPoint pointValue;
@property (readonly) NSSize sizeValue;
@property (readonly) NSRect rectValue;
@property (readonly) NSEdgeInsets edgeInsetsValue NS_AVAILABLE(10_10, 8_0);
复制代码
#比较方法
- (BOOL)isEqualToValue:(NSValue *)value;
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值