• (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的妖妖
  • 相关阅读:
    ガリレオの苦悩 攪乱す 1
    magento -- 添加中国省份列表
    magento使用google analytics
    Magento导出订单同时导出产品信息
    如何修改WAMP数据库上传文件的大小及上传时间限制
    magento插件手动下载
    Magento的价格去掉小数点
    magento首页调用最新产品
    url重写技术
    magento添加分类属性
  • 原文地址:https://www.cnblogs.com/yaoyao0110/p/4772192.html
Copyright © 2020-2023  润新知