NSNumber和NSString


NSNumber和NSString

内容概述

  • NSNumber
  • NSString 字符串
  • NSMutableString 可变字符串

12.1 NSNumber

Objective C中有很多基本数据类型,例如,int、float、double等。有时候我们需要将这些基本类型转换为类类型,这里我们就用到了NSNumber。NSNumber可以实现基本类型和类类型之间的相互转换。

要将基本类型转换为NSNumber类型,使用的方法是NSNumber中的类方法numberWithxxx,xxx表示数据类型。相反,将NSNumber类型转换为基本类型,一般使用xxxValue,xxx表示数据类型。下表是NSNumber的常用方法列表。

表12.1 将基本类型转换为NSNumber

方法名称 方法描述
numberWithChar 根据给定的字符,创建一个NSNumber对象
numberWithUnsignedChar 根据给定的无符号字符,创建一个NSNumber对象
numberWithShort 根据给定的短整型,创建一个NSNumber对象
numberWithUnsignedShort 根据给定的无符号短整型,创建一个NSNumber对象
numberWithInteger 根据给定的长整型,创建一个NSNumber对象
numberWithUnsignedInteger 根据给定的无符号长整型,创建一个NSNumber对象
numberWithInt 根据给定的整型,创建一个NSNumber对象
numberWithUnsignedInt 根据给定的无符号整型,创建一个NSNumber对象
numberWithLong 根据给定的长整型,创建一个NSNumber对象
numberWithUnsignedLong 根据给定的无符号长整型,创建一个NSNumber对象
numberWithFloat 根据给定的单精度浮点,创建一个NSNumber对象
numberWithDouble 根据给定的双精度浮点,创建一个NSNumber对象
numberWithBool 根据给定的布尔类型,创建一个NSNumber对象

表12.2 将NSNumber对象转换为基本类型

方法名称 方法描述
charValue 获得NSNumber对象的字符基本类型
unsignedCharValue 获得NSNumber对象的无符号字符基本类型
shortValue 获得NSNumber对象的短整型基本类型
unsignedShortValue 获得NSNumber对象的无符号短整型基本类型
integerValue 获得NSNumber对象的长整型基本类型
unsignedIntegerValue 获得NSNumber对象的无符号长整型基本类型
intValue 获得NSNumber对象的整型基本类型
unsignedIntValue 获得NSNumber对象的无符号整型基本类型
longValue 获得NSNumber对象的长整型基本类型
unsignedLongValue 获得NSNumber对象的无符号长整型基本类型
floatValue 获得NSNumber对象的单精度浮点基本类型
doubleValue 获得NSNumber对象的双精度基本类型
boolValue 获得NSNumber对象的布尔基本类型

下面通过一个案例,来演示NSNumber类型和基本数据类型之间的相互转换。步骤如下:

  1. 定义一个类,定义三个方法,分别实现NSNumber和基本类型之间相互转换、将NSNumber对象转换为字符串和NSNumber的比较。
@interface NSNumberTest : NSObject

// NSNumber和基本类型之间相互转换

-(void)convert1;

// 将NSNumber对象转换为字符串

-(void)convert2;

// 比较

-(void)compare;

@end
  1. 实现NSNumber和基本类型之间相互转换
// NSNumber和基本类型之间相互转换

-(void)convert1{

    // 1. 使用静态方法创建NSNumber对象,该过程是将基本数值类型转换为NSNumber类型

    // 布尔类型BOOL

    BOOL b = YES;

    NSNumber *myBoolNumber = [NSNumber numberWithBool:b];

    // 字符类型char

    char c = 'A';

    NSNumber *myCharNumber = [NSNumber numberWithChar:c];

    // 双精度类型

    double d = 3.1415;

    NSNumber *myDoubleNumber = [NSNumber numberWithDouble:d];

    // 单精度

    float f = 3.14;

    NSNumber *myFloatNumber = [NSNumber numberWithFloat:f];

    // 整型

    int i = 100;

    NSNumber *myIntNumber = [NSNumber numberWithInt:i];

    // NSInteger

    NSInteger integer = 100;

    NSNumber *myIntegerNumber = [NSNumber numberWithInteger:integer];

    // 长整型

    long int l = 123456;

    NSNumber *myLongNumber = [NSNumber numberWithLong:l];

    // long long 类型

    long long int lli = 12345678;

    NSNumber *myLongLongNumber = [NSNumber numberWithLongLong:lli];

    // 短整型

    short int si = 1;

    NSNumber *myShortNumber = [NSNumber numberWithShort:si];

    // 无符号char

    unsigned char uc = 'x';

    NSNumber *myUnsignedChar = [NSNumber numberWithUnsignedChar:uc];

    // 无符号整型

    unsigned int ui = 135;

    NSNumber *myUnsignedInt = [NSNumber numberWithUnsignedInt:ui];

    // NSUInteger

    NSUInteger ui2 = 123;

    NSNumber *myNSUInteger = [NSNumber numberWithUnsignedInteger:ui2];

    // unsigned long int

    unsigned long int uli = 123;

    NSNumber *myUnsignedLongInt = [NSNumber numberWithUnsignedLong:uli];

    // unsigned long long int

    unsigned long long int ulli = 123;

    NSNumber *myUnsignedLongLongInt = [NSNumber numberWithUnsignedLongLong:ulli];

    // unsigned short

    unsigned short int usi = 1;

    NSNumber *myUnsignedShortInt = [NSNumber numberWithUnsignedShort:usi];



    // 2. 将NSNumber转换为基本整型

    // BOOL

    b = [myBoolNumber boolValue];

    NSLog(@"b=%d",b);

    // char

    c = [myCharNumber charValue];

    NSLog(@"c=%c",c);

    // double

    d = [myDoubleNumber doubleValue];

    NSLog(@"d=%f",d);

    // float

    f = [myFloatNumber floatValue];

    NSLog(@"d=%f",f);

    // int

    i = [myIntNumber intValue];

    NSLog(@"i=%d",i);

    // NSInteger

    integer = [myIntegerNumber integerValue];

    NSLog(@"integer=%ld",integer);

    // long

    l = [myLongNumber longValue];

    NSLog(@"l=%ld",l);

    // long long

    lli = [myLongLongNumber longLongValue];

    NSLog(@"lli=%lli",lli);

    // short int

    si = [myShortNumber shortValue];

    NSLog(@"si=%d",si);

    // unsigned char

    uc = [myUnsignedChar unsignedCharValue];

    NSLog(@"uc=%c",uc);

    // unsigned int

    ui = [myUnsignedInt unsignedIntValue];

    NSLog(@"ui=%ud",ui);

    // NSUInteger

    ui2 = [myNSUInteger unsignedIntegerValue];

    NSLog(@"ui2=%lu",(unsigned long)ui2);

    // unsigned long int

    uli = [myUnsignedLongInt unsignedLongValue];

    NSLog(@"uli=%lu",uli);

    // unsigned long long int

    ulli = [myUnsignedLongLongInt unsignedLongLongValue];

    NSLog(@"ulli=%llu",ulli);

    // unsigned short

    usi = [myUnsignedShortInt unsignedShortValue];

    NSLog(@"usi=%u",usi);

}
  1. 实现将NSNumber对象转换为字符串方法。
// 将NSNumber对象转换为字符串

-(void)convert2{

    // 将NSNumber对象转换为字符串

    NSNumber *n = [NSNumber numberWithDouble:3.14];

    NSString *s = [n stringValue];

    NSLog(@"s=%@",s);

    // 将字符串转换为基本类型

    NSString *snumber = @"100";

    int num = [snumber intValue];

    NSLog(@"num=%d",num);

}
  1. 实现比较NSNumber方法比较,比较的结果是NSComparisonResult的枚举类型,这里面有三个常量,NSOrderedAscending :升序,NSOrderedSame:相等,NSOrderedDescending:降序。
// 比较两个NSNumber的大小

-(void)compare{

    NSNumber *num1 = [NSNumber numberWithInt:200];

    NSNumber *num2 = [NSNumber numberWithInt:200];

    // 比较

    NSComparisonResult result = [num1 compare:num2];

    // 判断大小

    if (result==NSOrderedAscending) {

        NSLog(@"num1<num2");

    }else if(result==NSOrderedDescending){

         NSLog(@"num1>num2");

    }else{

        NSLog(@"num1==num2");

    }

}

12.2 NSString 字符串

字符串是一个字符序列,用来表示一些文本内容。Objective C中的字符串包括不可变字符(NSString)和可变字符(NSMutableString)。下面我们先来看一下NSString的常用方法。

  1. NSString的初始化。

初始化一个NSString类可以直接进行赋值,例如,NSString str = @"Hello World!"。也可以使用已有的一个字符串初始化,- (id)initWithString:(NSString )aString,还可以使用格式化初始化方法,NSString *msg = [[NSString alloc]initWithFormat:@"%@,%d",name,age];也可以使用c字符串来初始化一个字符串[NSString stringWithUTF8String:"c string!"];。下面代码演示了NSString的初始化过程。

// 使用现有的字符串初始化

str = [[NSString alloc]initWithString:str];

NSLog(@"str=%@",str);

str = [NSString stringWithString:str];

NSLog(@"str=%@",str);

// 使用c字符串初始化

str = [NSString stringWithUTF8String:"c string!"];

NSLog(@"str=%@",str);

// 格式化字符串

NSString *name = @"tom";

int age = 30;

NSString *msg = [[NSString alloc]initWithFormat:@"%@,%d",name,age];

NSLog(@"%@",msg);

msg = [NSString stringWithFormat:@"%@,%d",name,age];

NSLog(@"%@",msg);
  1. 求字符串长度,获得某索引位置的字符。求字符串长度可以使用length方法,获得某索引位置的字符使用characterAtIndex方法。
// 1. 求字符串长度

NSString *str = @"Hello World!";

NSUInteger len = [str length];

NSLog(@"len=%lu",len);

// 2. 获得某索引位置的字符

char c = [str characterAtIndex:0];
  1. NSData 和字符串之间的转换。有时候需要在. NSData 和字符串之间的转换进行相互转换,例如,网络编程中。可以使用- (NSData )dataUsingEncoding:(NSStringEncoding)encoding;方法和- (id)initWithData:(NSData )data encoding:(NSStringEncoding)encoding;方法。
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"%@",str);
  1. 读写文件。可以使用- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;方法和进行文件读写。
// 读写文件

NSString *filePath = @"/tmp/test.txt";

NSString *content = @"file content";

[content writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];

content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

NSLog(@"str=%@",content);
  1. 取子字符串。可以从某个索引开始取到末尾,也可以从开始取到某个位置,还可以去某个范围。
str = @"Hello World!";

// 从某个索引开始

NSString *subString = [str substringFromIndex:2];

NSLog(@"subString=%@",subString);

// 到某个索引

subString = [str substringToIndex:5];

NSLog(@"subString=%@",subString);

// 取某个范围

NSRange range = NSMakeRange(2, 3);

subString = [str substringWithRange:range];

NSLog(@"subString=%@",subString);
  1. 字符串和数字类型的转换,有时候需要将包含数字的字符串转换为数字类型,可以使用xxxValue方法,xxx表示数据类型,例如,intValue。
str = @"123";

int i = [str intValue];

NSLog(@"i=%d",i);

str = @"3.14";

float f = [str floatValue];

NSLog(@"f=%f",f);
  1. 大小写转换,可以调用uppercaseString、capitalizedString和lowercaseString方法进行字母的下小写转换。
str = @"hello world!";

// 大写

str = [str uppercaseString];

NSLog(@"str = %@",str);

// 首字母大写

str = [str capitalizedString];

NSLog(@"str = %@",str);

// 小写

str = [str lowercaseString];

NSLog(@"str = %@",str);
  1. 字符串字典顺序比较。可以调用compare方法进行字符串
NSString *str1 = @"abcd";

NSString *str2 = @"abce";

NSComparisonResult result = [str1 compare:str2];

if (result==NSOrderedAscending) {

    NSLog(@"str1<str2");

}else if(result==NSOrderedDescending){

    NSLog(@"str1>str2");

}else{

     NSLog(@"str1==str2");

}

12.3 NSMutableString 可变字符串

NSString对象内容一旦创建则不可被修改,可以使用NSMutableString来维护一个可变字符串,可以实现字符串的添加、删除、替换等操作。下面的代码演示了如何进行可变字符串的初始化、添加、删除、替换等操作。

// 初始化方法

NSMutableString *str = [NSMutableString stringWithCapacity:20];

// 添加字符串

[str appendString:@"Hello world!"];

NSLog(@"str=%@",str);

// 删除字符串

NSRange range = NSMakeRange(0, 5);

[str deleteCharactersInRange:range];

NSLog(@"str=%@",str);

// 插入字符串

str = [NSMutableString stringWithCapacity:20];

[str appendString:@"Hello World!"];

[str insertString:@" Temp " atIndex:5];

NSLog(@"str=%@",str);

// 替换字符串

[str replaceCharactersInRange:NSMakeRange(5, 7) withString:@" new "];

NSLog(@"str=%@",str);

// 重置字符串

[str setString:@"set new string"];

NSLog(@"str=%@",str);