前言
OC程序必须依托于Foundation框架,Foundation框架其实就是一个类库。它包含了许多iOS/OS X开发中所必须的类。其中有3个数据结构类:字符串、数组和字典。本文就字符串类做相关讨论。
oc中的字符串 , 于给ios/mac 下应 程序服务.往后的ios/OS X应 程序开发,都使 oc字符串。
一.创建一个字符串对象:
//字面量语法,推荐这种语法,简单直观
//1.注意类名之后跟着*说明str1是一个指针,它指向"hello world!"(对象)所在的内存,为什么加@,@表示它是一个对象
NSString * str1 = @"hello world!";
//%p用来打印地址,%@用以打印对象
//注:本例打印的地址是笔者电脑上的地址,不同的地址可能不一样
NSLog(@"str1(%p) : %@",str1,str1);// str1(0x100001040) : hello world!
//2.创建一个NSString类的空的对象
NSString * str2 = [[NSString alloc]init];
//
//str2 = @"hello world!";//str2(0x100001040) : hello world!
//注意到str1和str2的地址是一样的了么?为什么呢?因为@"hello world!"这个对象的地址只会被分配一次,在数据区。
str2 = @"How are you!";
NSLog(@"str2(%p) : %@",str2,str2);
//3.通过实例化方法创建字符串对象
NSString * str3 = [[NSString alloc]initWithString:@"hello world"];
NSLog(@"str3(%p) : %@",str3,str3);//str3(0x1000010c0) : hello world
//str3和str1都是指向hello world 的对象,为什么地址不一样呢?因为alloc会在堆区为对象申请一块空间
//4.根据C语言字符串创建OC字符串
//4.1通过构造方法
const char * p = "Come on!";
NSString *str4 = [[NSString alloc]initWithCString:p encoding:NSUTF8StringEncoding];
NSLog(@"str4(%p) : %@",str4,str4);//str4(0x100109520) : Come on!
//4.2通过类方法创建对象
NSString * str5 = [NSString stringWithUTF8String:p];
NSLog(@"str5(%p) : %@",str5,str5);//str5(0x1005003b0) : Come on!
//创建格式化的字符串
NSString *str6 =[NSString stringWithFormat:@"%@ %@",str1,str2];
NSLog(@"str6(%p) : %@",str6,str6);//str6(0x100700120) : hello world! How are you!
//通过类方法创建,str5、str6都是通过类方法创建的字符串
NSString * str7 = [NSString stringWithString:@"hello world"];
二.字符串常用方法
1.比较字符串
1.1是否相等
//isEqualToString方法判断两个字符串是否相等,相等返回1,否则返回0
NSString * str1 = @"this is a string";
NSString * str2 = @"this is a string";
BOOL ret = [str1 isEqualToString:str2];
if(ret){
NSLog(@"str1 = str2");
}else{
NSLog(@"str1 ≠ str2");
}
//str1 = str2,如果对其中一个字符串稍作改动就会得到str1 ≠ str2
1.2比较字符串大小
//compare方法比较大小,返回值是一个枚举typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};分别为升序,相等、降序
NSString *astring01 = @"This is a String!";
NSString *astring02 = @"This is a String!";
BOOL result = [astring01 compare:astring02] == NSOrderedSame;//0
NSLog(@"result:%d",result);// result:1,说明是相等的,其他两种就不一一的试了,原理是一样的
1.3不考虑大小写比较字符串大小,
//caseInsensitiveCompare方法
NSString *astring1 = @"this is a String!";
NSString *astring2 = @"This is a String!";
BOOL result = [astring1 caseInsensitiveCompare:astring2] == NSOrderedSame;
NSLog(@"result:%d",result);//result:1
2.大小写转换
//先得到一个要转换的字符串
NSString * string = @"This is A String";
//2.1小写转换大写
NSString *lString = [string uppercaseString];
NSLog(@"lString = %@",lString);//LString = THIS IS A STRING
//那么原来的字符串有没有变化呢?
NSLog(@"string = %@",string);//string = This is A String
//这说明原来的字符串不会发生变化,LString是一个新的字符串
//2.2大写转小写
NSString *sString=[string lowercaseString];
NSLog(@"sString = %@",sString);//sString = this is a string
//2.3首字母大写
NSString *cString = [sString capitalizedString];
NSLog(@"cString = %@",cString);//cString = This Is A String
3.字符串搜索
//rangeOfString
//在已知字符串(父串)中查找某个单词或者某一句话(子串)的范围
NSString *fatherString = @"I'm a iOS programmer";
NSString *sonString = @"iOS";
//定义一个结构体NSRange,range表示子串在父串中的范围(起始位置,和长度)
//注意这个方法的两个参数分别是父串、子串
NSRange range = [fatherString rangeOfString:sonString];
NSUInteger location = range.location;
NSUInteger length = range.length;
NSLog(@"%lu,%lu",location,length);//当不存在子串时,location的值是一个非常大的值,笔者电脑上是9223372036854775807,length的值为0
//输出结果6,3;表示是子串(iOS)在父串中的位置是下标为6开始,持续3个长度,注意在计算机系统中的下标都是从0开始的
4.抽取子串,必须有父串
//方法1.从开头位置开始,截取到某个位置为止:substringToIndex
NSString *fatherString = @"Hello , I'm a iOS programmer!";
NSString * string01 = [fatherString substringToIndex:12];
NSLog(@"string01 = %@",string01);//string01 = Hello , I'm ,注意最后有一个空格“a”是第12个位置上的字符,可见这个方法是不包括给定位置的
//方法2.从指定为止开始,截取到最后,substringFromIndex,这个方法是包括指定位置的
NSString * string02 = [fatherString substringFromIndex:12];
NSLog(@"string02 = %@",string02);//string02 = a iOS programmer!
//方法3.截取指定范围的字符串substringWithRange,这个方法的参数是一个NSRange,前面说了,它是一个结构体,怎么构造一个结构体呢?
//OC中凡是结构体,都有对于的NSMake方法可以构造
NSString * string03 = [fatherString substringWithRange:NSMakeRange(5, 10)];
NSLog(@"string03 = %@",string03);//string03 = , I'm a i
5.判断字符串的前缀、后缀
//这个方法在后期的文件操作中经常用到
//比如有个"iOS.txt"文件
NSString * pathString = @"iOS.txt";
//- (BOOL) hasPrefix: (NSString *) aString;
//判断前缀是否是iOS,返回只是一个BOOL类型
//三目运算符?:,?之前的条件位置,执行:之前的语句,否则执行:后面的语句
[pathString hasPrefix:@"iOS"]?NSLog(@"YES"):NSLog(@"NO");//YES
//判断后缀+ (BOOL) hasSuffix: (NSString *) aString;
[pathString hasSuffix:@"txt"]?NSLog(@"YES"):NSLog(@"NO");//YES
字符串先告一段落,本篇讲的是不可变字符串,当然还有其他方法,笔者不一一赘述了,有兴趣的可以自己去研究一下,下一篇将讨论可变字符串可变字符串
喜欢的话,帮忙点一下喜欢,谢谢!
如果有错误之处或者偏差,还请斧正!
欢迎大家留言提问,技术要交流才能更快成长!