(ios开发)基本数据类型和结构体的封装与解封

ios开发基本数据类型和结构体的封装与解封 -- 妖妖

//知识:

//因为基本数据类型和结构体不是继承自NSObject,所以它们不可以直接存放到数组和字典中。

//数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的(也就是说有些NSObject的方法是无法调用的),这个时候通常会用到装箱(boxing)和拆箱(unboxing)。但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱。

 

//在ObjC中我们一般将基本数据类型装箱成NSNumber类型(当然它也是NSObject的子类,但是NSNumber不能对结构体装箱),调用其对应的方法进行转换:

@interface c (NSNumberCreation)

//基本数据类型的封装

+ (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 NS_AVAILABLE(10_5, 2_0);

+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);

 

//基本数据类型的解封

@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 *number=[NSNumber numberWithInt:2];

    NSArray *array=[NSArray arrayWithObject:number];

//解封

    [number intValue];

 

 

//结构体呢的封装和解封需要引入另外一个类型NSValue,其实上面的NSNumber就是NSValue的子类,它包装了一些基本数据类型的常用装箱、拆箱方法,而NSValue可以对任何数据类型进行装箱、拆箱操作。

 

//对于常用的结构体Foundation已经为我们提供好了具体的装箱方法如下:

@interface NSValue (NSValueUIGeometryExtensions)

//结构体的封装

+ (NSValue *)valueWithCGPoint:(CGPoint)point;

+ (NSValue *)valueWithCGVector:(CGVector)vector;

+ (NSValue *)valueWithCGSize:(CGSize)size;

+ (NSValue *)valueWithCGRect:(CGRect)rect;

+ (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;

+ (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets;

+ (NSValue *)valueWithUIOffset:(UIOffset)insets NS_AVAILABLE_IOS(5_0);

 

//结构体的解封

- (CGPoint)CGPointValue;

- (CGVector)CGVectorValue;

- (CGSize)CGSizeValue;

- (CGRect)CGRectValue;

- (CGAffineTransform)CGAffineTransformValue;

- (UIEdgeInsets)UIEdgeInsetsValue;

- (UIOffset)UIOffsetValue NS_AVAILABLE_IOS(5_0);

 

//封装

    CGPoint point=CGPointMake(10, 20);

    NSValue *value=[NSValue valueWithCGPoint:point];//对于系统自带类型一般都有直接的方法进行包装

    NSArray *array=[NSArray arrayWithObject:value];//放倒数组中

//解封

     CGPoint point1=[value CGPointValue];

 

//自定义结构体的封装与解封

    typedef  struct{  //自定义一个结构体Student

        int age;

        int number;

    }Student;

    Student stu;

    stu.age = 10;

    stu.number = 100;

    NSValue *va = [NSValue value:&stu withObjCType:@encode(Student)];

    Student  value2;//定义一个结构体变量来接受从NSValue得到的结构体

    [va getValue:&value2];//把va对象中的结构体取出来

    int a=value2.age;  //取得结构体中的字段

爱code的妖妖
原文地址:https://www.cnblogs.com/yaoyao0110/p/4772192.html