【iOS】——OC的包装类

C语言中包括的基本数据类型(如short、int、float、double等)都不是对象,它们也不具备“对象”的特性——没有属性、方法可以被调用。
OC提供了NSValue、NSNumber来封装C语言的基本类型,从而使它们具有面向对象的特征。

它们不是包装类

在进行iOS开发时,会遇到以下3个类型:
➡️NSInteger:大致等于long型整数。
➡️NSUInteger:大致等于unsigned long型整数。
➡️CGFloat:在64位平台上大致相当于double,在32位平台大致相当于float。
注:以上不是包装类,它们依然只是基本类型。当程序需要定义整型变量时,建议使用NSInteger、NSUInteger。在64位平台上,CGFloat相当于double类型,CGFloat相当于float类型。为了更好地兼顾不同的平台,当程序需要定义浮点型变量时,建议使用CGFloat。

NSValue和NSNumber

NSValue和NSNumber都是包装类,其中NSVable是NSNumber的父类:NSValue代表一个更通用的包装类,它可用于包装单个short、int、long、float、char、指针、对象id等数据项,通过该包装类,就可以把short、int、long、float、char、指针等添加到NSArray、NSSet等集合(这些集合要求它们的元素必须是对象)中。

NSNumber是更具体的包装类,主要用于包装C语言的各种数值类型,NSNumber主要包括如下3类方法:
➡️+numberWithXxx:该类方法直接将特定类型的值包装成NSNumber。
➡️-initWithXxx:该实例方法需要先创建一个NSNumber,再用一个基本类型的值来初始化NSNumber。
➡️-XxxValue:该实例方法返回该NSNumber对象包装的基本类型的值。
上述方法中的Xxx可以代表int、char等各种基本类型。前两类方法的基本功能相似,都是把一个基本类型的值包装成包装类的实例,第三类方法则用于从包装类中取出基本类型的值。
在这里插入图片描述

基本类型与包装类之间的转换:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    
    @autoreleasepool {
    
    
        //调用类方法将int类型的值包装成NSNumber对象
        NSNumber* num =[NSNumber numberWithInt:20];
        //调用类方法将double类型的值包装成NSNumber对象
        NSNumber* de = [NSNumber numberWithDouble:3.4];
        NSLog(@"%d" , [num intValue]);
        NSLog(@"%g" , [de doubleValue]);
        //先创建NSNumber对象,再调用initWithXxx方法执行初始化
        NSNumber* ch = [[NSNumber alloc] initWithChar:'J'];
        //直接输出NSNumber对象,使用%@格式字符串
        NSLog(@"%@", ch);
    }
    return 0;
}

效果展示:
在这里插入图片描述

从以上代码可以看出:将基本类型的值转换为包装类简单的做法就是调用numberWithXxx:类方法,调用该方法时传入一个基本类型的值该方法就会返回包装该值的包装类实例。如果需要从包装类实例中获取基本类型的值,调用XxxValue实例方法即可。
基本类型变量和包装类对象之间的转换关系如图所示:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_50990189/article/details/117432177