字符串(NSString、NSMutableString)是OC语言中很常用的一个类。NString和NSMutableString最主要的区别就是NSString一旦创建赋值后就不能对其内容进行修改(如长度、插入字符、删除字符),除非重新赋值;而NSMutableString在其创建赋值后可以对其进行删除、插入、修改长度等操作。本篇文章只介绍NSString的一些简单的用法(初学者)
1.字符串的初始化
1>通常创建一个字符串
NSString* s1= [[NSString alloc]initWithFormat:@"所需要的字符串"]; //实例方法
NSString* s1 = [NSString stringWithFormat:@"所需要的字符串"]; //类方法
2>C字符串转换成OC字符串
NSString* s1 = [[NSString alloc]initWithUTF8String:"cString"];//实例方法
NSString* s1 = [NSString stringWithUTF8String:"cString"]; //类方法
3>最简单的一种方式如下:
NSString* s1=@"所需要的字符串";
2.字符串的长度
1>获取字符串的长度
NSString* s1=@"123abc";
NSUInteger len = [s1 length]; //或者s1.length
2>判断一个字符串中是否包含某个子字符串 并显示其范围
这里要用到一个结构体类NSRange 内容如下:
typedef struct _NSRange {
NSUInteger location; //子字符串第一个字符的位置
NSUInteger length; //子字符串的长度
} NSRange;
NSString * s2=@"abc123cdef";
NSRange range = [s2 rangeOfString:@"123"]; //查找字符串@"123"在s2中的范围
NSLog(@"range locatin:%lu", range.location); //'1'的位置
NSLog(@"range length:%lu", range.length); //@"123"的长度
//是否存在
if(range.location == NSNotFound)
{
NSLog(@"没有找到字符串123");
}
打印结果:
3>获取指定范围的字符串
//获取指定范围的子串
NSString *s3=@"abc1234567def";
NSString * sub1 = [s3 substringWithRange:NSMakeRange(3, 7)];
NSLog(@"sub1:%@", sub1);
//返回指定下标之前的字符串(**注意**不包括该字符)
NSString *sub2=[s3 substringToIndex:3];
NSLog(@"sub2:%@", sub2);
//返回指定下标之后的字符串(**注意**包括该字符)
NSString *sub3=[s3 substringFromIndex:3];
NSLog(@"sub3:%@", sub3);
打印结果:
3、获取字符串的某个特定的字符
需要注意的是英文字符和汉字的区别,英文字符只占一个字节,而汉字占3个字节。但是算字符串的长度时汉字也是一个长度,代码如下:
NSString * s1=@"a肖";
NSLog(@"s1的长度:%lu", [s1 length]); //字符串长度
NSLog(@"s1的第一个字符:%c", [s1 characterAtIndex:0]);
NSLog(@"s1的第二个字符:%d", [s1 characterAtIndex:1]); //不能用%@打印 取出的第二个字符不是类对象
unichar ch =[s1 characterAtIndex:1];
NSString *s2=[NSString stringWithCharacters:&ch length:1];
NSLog(@"取汉字字符:%@", s2);
打印结果如下:
4、字符串的大小写转化 和转换成C中的接本数据类型
NSString *str=@"china";
NSString *upStr=[str uppercaseString]; //全部转化成大写CHINA
NSString *lowStr=[upStr lowercaseString]; //全部转化成小写china
NSString* capitalStr=lowStr.capitalizedString; //首字母大写China
下面的属性都可以用点语法点出来 或调用实例方法
NSString * s1=@"123";
int a=s1.intValue; //或者int a=[s1 intValue];
@property (readonly) double doubleValue; //转换成double类型
@property (readonly) float floatValue; //转换成float类型
@property (readonly) int intValue; //转换成整形
@property (readonly) NSInteger integerValue; //长整形 NSInteger=long
@property (readonly) long long longLongValue; //长长整形
@property (readonly) BOOL boolValue ; //布尔类型
5、字符串大小的比较
字符串的创建会有一些优化,当你创建NSString* s1=@”abc”时,会有一个字符串池存储@”abc”。你再次创建一个NSString* s2=@”abc”时,不会马上重新开辟内存,而是从字符串池中查找若存在,则将s1的直接赋给s2。这样s1和s2指向同一个地址。这样你用==去判断两个字符串是否相等也行,因为 ==本质上是判断两个字符串的地址是否相等。
NSString* s1=@"abc";
NSString* s2=@"abc";
NSLog(@"s1的地址%p",s1);
NSLog(@"s2的地址%p",s2);
if (s1 == s2)
NSLog(@"==判断 s1和s2相等");
//使用初始化创建的字符串,将会重新开辟内存,所以用==判断就得不到想要的结果
NSString* s3=[NSString stringWithFormat:@"%@",@"abc"];
NSLog(@"s3的地址%p", s3);
if (s1 == s3)
NSLog(@"==判断 s1和s3相等"); //将不会打印
但是在实际开发中,不能用”==”去判断两个字符串是否相等。必须使用NString提供的方法isEqualToString去判断。它包含两层意思:
1>若两个字符串的地址相等,则直接返回YES;
2>若地址不相等,再去判断两个字符串的每个字符是否一样,一样返回YES
if([s3 isEqualToString:s1])
{
NSLog(@"isEqualToString判断:s1和s3相等");
}
打印结果:
还有一个升级版的判断方式”compare:”,能够比较字符串的大小。是一个一个字符之间的比较(也可以看成是转换成ASCII值进行比较),返回一个枚举类型。
NSString *s1=@"acb";
NSString *s2=@"abcd";
//比较大小或相等 返回枚举值:NSCoparisonResult
NSComparisonResult ret=[s1 compare:s2];
if(ret == NSOrderedAscending)
NSLog(@"s1<s2"); //NSOrderedAscending升序
else if (ret==NSOrderedDescending)
NSLog(@"s1>s2"); //NSOrderedDescending降序
else
NSLog(@"s1=s2"); //NSOrderedSame 相等
6、字符串的分割
componentsSeparatedByString:这个实例方法可以将一个字符串用这个字符串中的某个字符进行分割 得到一个数组:
NSString* s1=@"i love you";
NSArray* arr=[s1 componentsSeparatedByString:@" "];//用字符空格进行分割
for (int i=0; i<arr.count; i++)
{
NSLog(@"arr[%d]:%@",i, arr[i]);
}
打印结果:
7、判断字符串的前缀和后缀
有时可能会遇到判断一个字符串是否以@”XXX”开头,或者将同种类型的文件放在一个文件夹中(判断是否有相同的后缀)
NSString* s1=@"www.baidu.com";
if([s1 hasPrefix:@"www"]) //前缀
NSLog(@"s1以www开头");
if([s1 hasSuffix:@".com"]) //后缀
NSLog(@"s1以.com结尾");