系列:iOS開發(fā)-NSString

系列: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)來...

Demo地址:https://github.com/spicyShrimp/DEMO_OC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笑跛,一起剝皮案震驚了整個濱河市付魔,隨后出現(xiàn)的幾起案子聊品,更是在濱河造成了極大的恐慌飞蹂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翻屈,死亡現(xiàn)場離奇詭異陈哑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門惊窖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刽宪,“玉大人,你說我怎么就攤上這事界酒∈ブ簦” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵毁欣,是天一觀的道長庇谆。 經(jīng)常有香客問我,道長凭疮,這世上最難降的妖魔是什么饭耳? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮执解,結(jié)果婚禮上寞肖,老公的妹妹穿的比我還像新娘。我一直安慰自己衰腌,他們只是感情好新蟆,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著右蕊,像睡著了一般栅葡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尤泽,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天欣簇,我揣著相機(jī)與錄音,去河邊找鬼坯约。 笑死熊咽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闹丐。 我是一名探鬼主播横殴,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卿拴!你這毒婦竟也來了衫仑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤堕花,失蹤者是張志新(化名)和其女友劉穎文狱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘挽,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瞄崇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年呻粹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苏研。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡等浊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摹蘑,到底是詐尸還是另有隱情筹燕,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布衅鹿,位于F島的核電站庄萎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏塘安。R本人自食惡果不足惜糠涛,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兼犯。 院中可真熱鬧忍捡,春花似錦、人聲如沸切黔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纬霞。三九已至凌埂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诗芜,已是汗流浹背瞳抓。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留伏恐,地道東北人孩哑。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像翠桦,于是被迫代替她去往敵國和親横蜒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容