字符串
前言
字符串其實就是我們最常用的的NSString,但是它通過oc中爲字符串設定的很多方法,使它成爲一個應用範圍很廣的基本數據類型,我們可以用今天的知識做出簡單的語言屏蔽系統,文字輸入密碼檢測系統等小程序。而首先,我們要知道字符串是一個實例對象,也就是引用類型,例如NSString *str=[NSString new];中,其實str本質就是一個指針。所以我們首先要學習如何將OC和C中的基本數據類型轉換成對象,纔可以更加方便我們學習字符串。
封裝|拆包
OC中的封裝、拆包基本數據類型
NSValue / NSNumber
功能:
將OC和C中的基本數據類型轉換成實例對象,即值類型 轉換 引用類型
C和OC中 常用的數據類型
int a=5;
float b=5.0;
double c=5.5;
char d='a';
bool flag=YES;
// CGPoint point={3, 4)};
// CGSize size={5,6};
// CGRect rect={3, 4, 5, 6};
// NSRange range={10,3};
CGPoint point=CGPointMake(3, 4);
CGSize size=CGSizeMake(5, 6);
CGRect rect=CGRectMake(3, 4, 5, 6);
NSRange range=NSMakeRange(10, 3);
NSEdgeInsets edgeInsets=NSEdgeInsetsMake(10, 10, 10, 10);
封裝
NSValue / NSNumber
NSNumber:NSValue
其中NSValue 可以將CGPoint、CGSize、CGRect、NSRange、NSEdgeInsets轉換成對象:
NSValue *pointVa=[NSValue valueWithPoint:point];
NSValue *sizeVa=[NSValue valueWithSize:size];
NSValue *rectVa=[NSValue valueWithRect:rect];
NSValue *rangeVa=[NSValue valueWithRange:range];
NSValue *edgeVa=[NSValue valueWithEdgeInsets:edgeInsets];
其中NSNumber 可以將int、float、double、char、bool等基本數據類型轉換成對象:
NSNumber *intNum=[NSNumber numberWithInt:a];
NSNumber *floatNum=[NSNumber numberWithFloat:b];
NSNumber *doubleNum=[NSNumber numberWithDouble:c];
NSNumber *charNum=[NSNumber numberWithChar:d];
NSNumber *boolNum=[NSNumber numberWithBool:flag];
拆包
int a1=[intNum intValue];
float b1=[floatNum floatValue];
double c1=[doubleNum doubleValue];
char d1=[charNum charValue];
bool flag1=[boolNum boolValue];
CGPoint point1=[pointVa pointValue];
CGSize size1=[sizeVa sizeValue];
CGRect rect1=[rectVa rectValue];
NSRange range1=[rangeVa rangeValue];
NSEdgeInsets edgeInsets1=[edgeVa edgeInsetsValue];
不可變字符串
字符串分爲 :不可變字符串和 可變字符串,其中區別就是,可變字符串的空間是可以改變的,而不可變字符串已被設定了,其空間就是不可改變的了,就算後面一些所謂增加拼接賦值操作,也就是改變該不可變字符串的指針而已。
不可變字符串 NSString
可變字符串 NSMutableString
*/
初始化一個字符串對象
NSString *string1=@"ibokanwisdom";
NSString *string2=[NSString stringWithFormat:@"Jack"];
// NSString *string3=[NSString stringWithFormat:@"%@%@",@"Jack",@"Rick"];
// NSLog(@"%@",string2);
// NSLog(@"%@",string3);
// NSString *string3=[[NSString alloc]initWithFormat:<#(nonnull NSString *), ...#> ];
//NSString *string3=[[NSString alloc]initWithString:@"ibokanwisdom" ];
使用NSString的類方法來創建字符串 +
NSString *string4=[NSString stringWithFormat:@"%@,%d,%f,hi guy",@"Rick",5,5.5];
// NSLog(@"%@",string4);
//(lldb)通過斷點裏面的po 輸出的類型 指令打印出來
NSString *string5=@"Rick";
NSString *string6=@"666";
NSString *string7=[NSString stringWithFormat:@"%@%@",string5,string6];
NSLog(@"%@",string7);
從本地文件讀取字符串
NSString *path1=@"/Users/macpro/Desktop/oc/OC-006-02/OC-006-02/hello.html";
NSError *error;
NSString *string8=[NSString stringWithContentsOfFile:path1 encoding:NSUTF8StringEncoding error:&error];
NSLog(@"string8 =%@,error=%@",string8,error);
從網絡讀取字符串
NSURL *url=[NSURL URLWithString:@"http://www.baidu.com"];
error=nil;
NSString *string9=[NSString stringWithContentsOfURL:url encoding:4 error:&error];
NSLog(@"%@",string9);
字符串的操作
NSString *string10=@"你是逗比麼,我都受不了你了";
NSUInteger length=[string10 length];
// NSLog(@"%lu",(unsigned long)length);
NSLog(@"%ld",length);
//字符串的截取
NSString *subString1=[string10 substringToIndex:5];
//獲取字符串開頭到字符串的to的位置的字符串內容,不包括to位置的字符串
NSLog(@"subString1=%@",subString1);
NSString *subString2=[string10 substringFromIndex:6];
//獲取字符串從from的位置到結尾的字符串,包括from的位置
NSLog(@"%@",subString2);
NSString *subString3=[string10 substringWithRange:NSMakeRange(2, 2)];
NSLog(@"%@",subString3);
NSString *string11=@"abcdefg";
char c=[string11 characterAtIndex:0];//根據字符串的位置index來獲得一個字符,注意字符串的索引從 0 開始。
NSLog(@"%c",c);
字符串的比較,如何判斷兩個字符串是否相等
if(subString2 ==subString3){
//內容和指針都相等的時候,才成立
NSLog(@"subString2和subString3相等");
}else{
NSLog(@"subString2和subString3不相等");
}
淺拷貝和深拷貝
如何讓兩個字符串 指針 和 內容 都相同?
深拷貝和淺拷貝的區別
淺拷貝:對象和拷貝的內容共用一份實體,僅僅是引用的變量名稱不一樣。
深拷貝:原對象和拷貝的對象相互獨立,其中任何一個對象的改動都不會對另一個對象造成影響
NSString *subString4=[NSString stringWithString:subString2];
//NSString *subString4=[NSString stringWithFormat:subString2]; 指針不一樣
if(subString2 ==subString4){
//內容和指針都相等的時候,才成立
NSLog(@"subString2和subString4相等");
}else{
NSLog(@"subString2和subString4不相等");
}
//在實際開發過程中,我們通常通過只需要比較兩個字符串的內容是否想等
if ([subString2 isEqualToString:subString4]) {
NSLog(@"subString2和subString4相等");
}else{
NSLog(@"subString2和subString4不相等");
}
比較兩個字符串的大小
NSString *cmpString1=@"hehehehe";
NSString *cmpString2=@"hahaha";
NSComparisonResult result=[cmpString1compare:cmpString2];
switch (result) {
case NSOrderedAscending:{
NSLog(@"cmpString1 < cmpString2,升序");
break;
}
case NSOrderedSame:{
NSLog(@"cmpString1 = cmpString2");
break;
}
case NSOrderedDescending:{
NSLog(@"cmpString1 > cmpString2,降序");
break;
}
default:
break;
}
根據字符串拿到對應的range
NSRange range=[string10 rangeOfString:@"逗比"];
NSLog(@"%@",[NSValue valueWithRange:range]);
指數出第一個遇到該字符串的位置及該字符串
NSRange range1=[string10 rangeOfString:@"你"];
NSLog(@"%ld,%ld",range1.location,range1.length);
判斷字符串中是否有 xx 前綴或 xx後綴
NSString *string12=@"http://www.baidu.com";
if([string12 hasPrefix:@"http://"]){
NSLog(@"含有此前綴");
}else{
NSLog(@"不含有此前綴");
判斷是否爲 .jpg 和 .png後綴
NSString *string13=@"xxxxx.jpg";
if ([string13 hasSuffix:@".jpg"] || [string13 hasSuffix:@".png"]) {
NSLog(@"含有此前綴");
}else{
NSLog(@"不含有此後綴");
}
字符串的拼接
NSString *string14=@"www.baidu.com";
NSString *string15=[@"http://"stringByAppendingString:string14];
NSLog(@"%@",string15);
//http://static.bigstockphoto.com/images/homepage/2016_popular_photo_categories.jpg
NSString *string16 =@"http://static.bigstockphoto.com";
NSString *string17 =@"images/homepage/2016_popular_photo_categories.jpg";
NSString *string18=[string16 stringByAppendingFormat:@"/%@",string17];//連接兩個字符串, 並且第二個字符串是按一定格式傳進來的
NSString *string19=[string16 stringByAppendingPathComponent:string17];//文件夾路徑的拼接
NSString *imagePath=@"http://static.bigstockphoto.com/images/homepage/2016_popular_photo_categories.jpg";
imagePath = [imagePath lastPathComponent];//取出最後一個反斜槓的內容
NSString *theImageName=@"Rick";
theImageName = [theImageName stringByAppendingPathExtension:@"png"];
字符串的其他常用工作
1.字符串的轉換函數
NSString *str=@"111addd33";
int a1=[str intValue];
NSLog(@"%d",a1);
2.字符串的大小寫轉換
NSString *str2= @"aAabb";
NSString *str3= [str2 uppercaseString];//將字符全部改成大寫
NSString *str4=[str3 lowercaseString];//將自負全部改成小寫
NSString *str5=[str4 capitalizedString];//將首個字符改成大寫,其餘的都小寫
NSString *str6=[str2 stringByReplacingOccurrencesOfString:@"bb" withString:@"dd"];
NSString *str7
=[str2 stringByReplacingCharactersInRange:NSMakeRange(1,2) withString:@"GG"];
NSString *str8=@"aa-bb-cc-dd-ee";
NSArray *array=[str8 componentsSeparatedByString:@"-"];//以separator爲分隔符,將原字符串的內容進行分割,分割得到的結果放到一個數組裏面,作爲返回值;
可變字符串
變字符串的父類是不可變字符串,所以不可變字符串的方法對於可變字符串也是適用的:
NSMutableString *mString=[NSMutableString stringWithString:@"nihao"];
NSMutableString *mString1=[NSMutableString stringWithFormat:@"%@",mString];
NSMutableString *mString2=[NSMutableString stringWithContentsOfFile:@"" encoding:4 error:nil];
NSMutableString *mString3= [NSMutableString stringWithContentsOfURL:[NSURL URLWithString:@""] encoding:NSUTF8StringEncoding error:nil];
可變字符串獨特的初始化方法
可變字符串獨特的初始化方法,初始化一個空間爲100的可變字符串
NSMutableString *mString4= [[NSMutableString alloc]initWithCapacity:100];
將c語言的字符串轉換成OC的字符串
[[NSString alloc]initWithCharacters:<#(nonnull const unichar *)#> length:<#(NSUInteger)#>]
可變字符串還可以進行增刪改操作,我們可以用一下例子說明一下簡單的語言屏蔽:
NSMutableString *targetString =[NSMutableString stringWithString:@"呵呵,我靠"];
NSRange range=[targetString rangeOfString:@"靠"];
// NSLog(@"%@",[NSValue valueWithRange:range]);
替代
[targetString replaceCharactersInRange:range withString:@"*"];
增
//指數出第一個遇到該字符串的位置及該字符串的長度
//在指定位置去一個字符串
[targetString insertString:@"ee" atIndex:3];
//在字符串末尾添加一個末尾
[targetString appendString:@"aaa"];
//在字符串的末尾添加多個字符串
[targetString appendFormat:@"%@",@"cc",@"dd"];
刪
[targetString deleteCharactersInRange:NSMakeRange(3,2)];