系列:iOS開發(fā)-NSString
之前說的都是比較偏理論的東西,很少有介紹一點正式開發(fā)中會使用到的,
今天在工作之余,抽空開始了整個系列的第一篇講解.
今天仍然不會直接講到開發(fā)的過程.
如題所述,今天講的是iOS開發(fā)中比較常用的一個數(shù)據(jù)類型------NSString,
那么什么是NSString?
我們簡單的進(jìn)入他的類定義去看看,
我們可以看到NSString 繼承自NSObject類型,那么他就不是我們C語言中的認(rèn)知的基礎(chǔ)數(shù)據(jù)類型了,
進(jìn)入NSObject,我們可以看到的是NSObject只有一個成員變量是Class類型的isa變量洁灵。那么Class類型又是什么東西呢鹤竭?看命名應(yīng)該是指所屬的類砾层。
@interface NSObject {
Class isa;
}
我們進(jìn)入Class中看看它到底是個什么東西喊衫。
我們發(fā)現(xiàn)Class就是一個結(jié)構(gòu)體的指針而已扫皱。
好吧,我們先不去探究這么深的底層的東西.
我們可以簡單的理解成NSObject是OC定義成的對象類型
NSString繼承NSObject,
沒有錯,他也是一個對象,
學(xué)過C++的話,我們一定都清楚什么叫做面向?qū)ο箝_發(fā),把所有的東西或者事物都抽象成一個對象,那么就會有該對象對應(yīng)的屬性和方法,比如一個人抽象成person類 那么其里面就有對應(yīng)的一些屬性比如age,sex...
對應(yīng)的一些方法比如eat,sleep,talk...
那么NSString也是這樣,
那么它應(yīng)該有什么屬性呢?我們可以猜一猜,沒有錯,就是字符串的長度,
帶著這個疑惑我們看看NSString的定義@property (readonly) NSUInteger length;
果然 有一個叫做length的屬性,代表字符串的長度....
那么他應(yīng)該有哪些方法呢?
我們可以想象.....
對應(yīng)下標(biāo)的字符是什么?
對應(yīng)范圍的子串是什么?
和其他字符串比較的方法...
字符串切割,拼接,逆序......
隨便就能想到好多....
OK,anywhere,我們帶著這些思路開始學(xué)習(xí)OC之字符串NSString
首先字符串是一個類.
那么我們想要一個我們字符串,怎么辦?沒有錯,創(chuàng)建一個字符串對象.
下面是我整理的創(chuàng)建方式,可能不全,但基本差不多了.
//1征炼、init
NSString *str1 = [[NSString alloc] init];
NSLog(@"str1 = %@",str1);
//2、initWithBytes:length:encoding:
NSString *str2 = [[NSString alloc] initWithBytes:"str2" length:4 encoding:NSUTF8StringEncoding];
NSLog(@"str2 = %@",str2);
//3吼鱼、initWithCharacters:length:
UniChar s[4] = {'s','t','r','3'};
NSString *str3 = [[NSString alloc] initWithCharacters:s length:4];
NSLog(@"str3 = %@",str3);
//4蓬豁、initWithCString:encoding:
NSString *str4 = [[NSString alloc] initWithCString:"str4" encoding:NSUTF8StringEncoding];
NSLog(@"str4 = %@",str4);
//5、initWithUTF8String:
NSString *str5 = [[NSString alloc] initWithUTF8String:"str5"];
NSLog(@"str5 = %@",str5);
//6菇肃、initWithFormat:
NSString *str6 = [[NSString alloc] initWithFormat:@"str6"];
NSLog(@"str6 = %@",str6);
// 7地粪、stringWithFormat:
NSString *str7 = [NSString stringWithFormat:@"str7"];
NSLog(@"str7 = %@",str7);
//8、stringWithCharacters:length:
UniChar ss[4] = {'s','t','r','8'};
NSString *str8 = [NSString stringWithCharacters:ss length:4];
NSLog(@"str8 = %@",str8);
//9琐谤、stringWithString://等價于直接賦值
// NSString * str9 = [NSString stringWithString:@"str9"];
NSString *str9 = @"str9";
NSLog(@"str9 = %@",str9);
//10蟆技、stringWithCString:encoding:
NSString *str10 = [NSString stringWithCString:"str10" encoding:NSUTF8StringEncoding];
NSLog(@"str10 = %@",str10);
//11、stringWithUTF8String:
NSString *str11 = [NSString stringWithUTF8String:"str11"];
NSLog(@"str11 = %@",str11);
對象創(chuàng)建完成之后,基本上就是某些操作方法了
OC中字符串常用的方法有這些,當(dāng)然遠(yuǎn)不止這些,至于具體的我們可以自己跳轉(zhuǎn)到類里面去看看 之前也說過了什么是實例方法,什么是類方法,只需要實驗一下即可
//常用方法
//length (獲得長度)
NSLog(@"%ld", [str11 length]);
NSLog(@"%ld", str11.length);
//characterAtIndex: (獲得某下標(biāo)對應(yīng)的字符)
NSLog(@"%c", [str11 characterAtIndex:1]);
//getCharacters:range: (獲得一定范圍內(nèi)的字符)
NSRange ran = NSMakeRange(1, 2);
[str11 getCharacters:s range:ran];
for (int i = 0; i < ran.length; i++) {
NSLog(@"s[%d] = %c",i,s[i]);
}
//substringFromIndex: (從某下標(biāo)開始截取字符串)
NSString *tmpStr = [str11 substringFromIndex:1];
NSLog(@"%@",tmpStr);
//substringToIndex: (截取字符串到某下標(biāo))
tmpStr = [str11 substringToIndex:2];
NSLog(@"%@",tmpStr);
//substringWithRange: (截取某范圍里的字符串)
tmpStr = [str11 substringWithRange:ran];
NSLog(@"%@",tmpStr);
//注意:所有的包括獲取截取等的都是采用的[)方式 即左包含 右不包含
//compare: (比較:結(jié)果為升序,降序,相等)
NSLog(@"%ld",[str11 compare:str10]);
//isEqualToString: (比較:兩者是否相等)
NSLog(@"%hhd",[str11 isEqualToString:str10]);
//hasPrefix: (是否有該字符串頭)
NSLog(@"%hhd",[str11 hasPrefix:@"st"]);
//hasSuffix: (是否有該字符串尾)
NSLog(@"%hhd",[str11 hasSuffix:@"11"]);
//uppercaseString (字符串全部轉(zhuǎn)成大寫)
NSLog(@"%@",[str11 uppercaseString]);
//lowercaseString (字符串全部轉(zhuǎn)成小寫)
NSLog(@"%@",[str11 lowercaseString]);
//capitalizedString (首字母大寫)
NSLog(@"%@",[str11 capitalizedString]);
//floatValue (轉(zhuǎn)換格式)
//doubleValue
//intValue
//integerValue
//longLongValue
//boolValue
NSLog(@"%f",[str11 floatValue]);
//rangeOfString: (子串在字符串中的位置)
NSLog(@"%@",NSStringFromRange([str11 rangeOfString:@"11"]));
//rangeOfCharacterFromSet: (某集合中的字符在字符串中的位置)
NSLog(@"%@",NSStringFromRange([str11 rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"s"]]));
//stringByAppendingString: (追加字符串)
NSLog(@"%@",[str11 stringByAppendingString:str10]);
//stringByAppendingFormat: (追加某格式化字符串)
NSLog(@"%@",[str11 stringByAppendingFormat:@"%d",1]);
//stringByReplacingOccurrencesOfString:withString: (用某子串替換某子串)
NSLog(@"%@",[str11 stringByReplacingOccurrencesOfString:@"11" withString:@"2"]);
//cStringUsingEncoding: (以一定格式轉(zhuǎn)成C字符串)
const char *p1 = [str11 cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"p1 = %s",p1);
方法肯定是無窮無盡的 ,有的OC幫我們實現(xiàn)了,有的OC沒有幫我們實現(xiàn),我們就需要自己去實現(xiàn),
比如逆序字母,比如逆序單詞....
以上講的都是NSString類,它又叫做不可變字符串,
那么既然說了不可變,對應(yīng)的就會有可變字符串?
是的,沒有做,它還有一個子類,叫做可變字符串NSMutableString
一樣的學(xué)習(xí)邏輯,
跳進(jìn)去看看
@interface NSMutableString : NSString
沒有錯,其屬于NSString的一個子類,那么會有什么意義呢?
簡單的說就是NSString的方法,它都可以用,而且他還有NSString沒有的一些方法
我們直接看文檔
簡單看一下,發(fā)現(xiàn)一個不一樣的地方 NSString方法里面返回值都是一個NSString類型的對象,但是NSMutableString返回值卻沒有,
為什么呢?簡單的就是說可變和不可變
可變的意思就是對這個字符串做操作,返回的新的結(jié)果或者字符串還是它本身,所以不需要新的返回對象,而不可變的意思則是創(chuàng)建的時候是什么樣子就是什么樣子,是不會改變的,返回的都是新的對象,當(dāng)然你可以直接用原來的對象來表示
例如:str11 = [str11 substringFromIndex:1];
同樣的,簡單列舉一些創(chuàng)建方法
//NSMutableString
//創(chuàng)建
//initWithCapacity:
NSMutableString *str12 = [[NSMutableString alloc]initWithCapacity:0];
NSLog(@"str12 = %@",str12);
//stringWithCapacity:
NSMutableString *str13 = [NSMutableString stringWithCapacity:0];
NSLog(@"str13 = %@",str13);
//initWithFormat:
NSMutableString *str14 = [[NSMutableString alloc]initWithFormat:@"str14"];
NSLog(@"str14 = %@",str14);
//stringWithFormat:
NSMutableString *str15 = [NSMutableString stringWithFormat:@"str15"];
NSLog(@"str15 = %@",str15);
//initWithString:
NSMutableString *str16 = [[NSMutableString alloc]initWithString:@"str16"];
NSLog(@"str16 = %@",str16);
//stringWithString:
NSMutableString *str17 = [NSMutableString stringWithString:@"str17"];
NSLog(@"str17 = %@",str17);
接下來是一些常用方法:
//常用方法
//replaceCharactersInRange:withString: (替換某范圍類的子串)
[str17 replaceCharactersInRange:NSMakeRange(0, 1) withString:@"1"];
NSLog(@"%@",str17);
//insertString:atIndex: (插入某子串在某個下標(biāo))
[str17 insertString:@"s" atIndex:1];
NSLog(@"%@",str17);
//deleteCharactersInRange: (刪除某個范圍內(nèi)的子串)
[str17 deleteCharactersInRange:NSMakeRange(0, 1)];
NSLog(@"%@",str17);
//appendString: (追加子串)
[str17 appendString:@"str17"];
NSLog(@"%@",str17);
//appendFormat: (追加格式化子串)
[str17 appendFormat:@"%d",1];
NSLog(@"%@",str17);
//setString: (設(shè)置字符串內(nèi)容)
[str17 setString:@"str17"];
當(dāng)然 方法遠(yuǎn)不止這些,還是上面說的,要想掌握一個類,那么就需要進(jìn)入這個類
從他的創(chuàng)建開始 從他的屬性開始 從他擁有的方法開始,逐一的了解,
如果這些都熟悉了我們就能使用它干成很多事情,
現(xiàn)在只是一個字符串,可能感覺不到什么,那么我能使用它干什么呢?
構(gòu)思一下,
一個文本框,他肯定是有內(nèi)容的,那么內(nèi)容是什么呢?沒有錯,就是字符串,
一個按鈕上面有顯示文字,那么這是什么呢?沒有錯,就是字符串,
總之,做開發(fā) ,所有能看到的文字都是字符串
那么看不到的呢?
一樣的, 比如我有一個人的對象,那么他會有一個名字的屬性 ,這個屬性我用什么類型來存儲呢?沒有錯,也是字符串....
所以在開發(fā)中我們會經(jīng)常使用到它,有意無意的使用到它,無論是明面上的表示,還是底層的某些方法,某些邏輯,某些存儲,都會用到
你可能會說,不就是一串文字嗎?能干什么?
簡單舉個之前的例子 this is a string 你能夠使用學(xué)過的邏輯比如if 比如for 又比如上面提到的這些方法 將他轉(zhuǎn)換成 string a is this 嗎?
沒有錯 ,這就是一個方法,開發(fā)中就會遇到這類情況
又比如 有一個人 name叫做xiaoming age是12 sex是男
我們能夠使用一個NSString表示成 姓名:xiaoming 性別:男 年齡:12么?
這些看似簡單,但其實都是開發(fā)中會遇到的,開發(fā)中所有遇到的復(fù)雜的方法都是由我們已知的簡單的方法或者多個邏輯判斷等實現(xiàn)出來的...
OK, 字符串暫時先講到這里, 后續(xù)還有字符串的內(nèi)容,我會繼續(xù)添加進(jìn)來...