程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 《C#妹妹和Objective-C阿姨對話錄》(03)NSString--再遇狗狗

《C#妹妹和Objective-C阿姨對話錄》(03)NSString--再遇狗狗

編輯:C#入門知識

C#妹妹:哇,冤家路窄啊,這個不是Objective-C阿姨家的狗狗麼?
狗狗:日,到底誰跟誰是冤家。。
C#妹妹:不服氣呀~再給你弄一陀吃吃。。
view sourceprint?01 #import <Foundation/Foundation.h> 

02 #import "Dog.h" 

03   

04 int main (int argc, const char * argv[]) 

05 { 

06   

07     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

08     Dog *d=[Dog new]; 

09     [d Eat:@"便便" EatQty:1]; 

10     [d release]; 

11     [pool drain]; 

12     return 0; 

13 }

狗狗:
C#妹妹:操,升級啦,看姐姐我扒你的皮,毀你的源代碼。。
Objective-C阿姨:你這個小姑娘為啥總跟我狗狗過不去呀。
C#妹妹:它不吃屎也就罷了,還說什麼“你留著自己吃。。。”,肯定程序出問題了,我幫他調試一下。
Objective-C阿姨:就是怕你再害它,我昨天給他升級了。。。現在代碼是這個樣子。。
view sourceprint?01 #import "Dog.h" 

02 @implementation Dog 

03 -(void) Sound 

04 { 

05     NSLog(@"汪汪!"); 

06 } 

07 BOOL isTrueFood(NSString  *food) 

08 { 

09     NSRange r=[@",包子,骨頭,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]]; 

10     if(r.length>0) 

11         return(YES); 

12     else

13         return(NO); 

14                  

15 } 

16 -(void) Eat:(NSString  *) food  EatQty:(int) count 

17 { 

18     if(isTrueFood(food)==YES) 

19     { 

20         NSLog(@"吃%d斤%@",count,food); 

21     } 

22     else

23     { 

24         NSLog(@"你留著自己吃吧。。。"); 

25     } 

26 } 

27 @end//Dog

C#妹妹:哇,我們天朝特色的敏感詞語過濾技術你都用上了。。。真是同一個世界,同一個噩夢啊。。。
Objective-C阿姨:,你能不能少貧點。。。。
C#妹妹:貌似其他都能看懂,除了這一句不太明白
view sourceprint?NSRange r=[@",包子,骨頭,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];

Objective-C阿姨:這個語句裡邊就是用了兩個NSString的方法。一個是實例方法rangeOfString,一個是類方法stringWithFormat。NSString是Cocoa中用於字符串處理的類,比C原始的字符串數組方便了很多,就像.NET的String一樣,內置了很多方法。
rangeOfString:功能類似與.NET中的String.IndexOf,判斷一個字符串在另一個字符串中的位置,但是返回的類型是NSRange,而不是數字
NSRange的定義估計你一看就知道怎麼回事了
view sourceprint?1 typedef struct _NSRange { 

2     NSUInteger location;//起始位置 

3     NSUInteger length;//長度 

4 } NSRange;

其實NSRange.location就相當於.NET中String.IndexOf的返回值。
C#妹妹:但是.NET中如果IndexOf檢索不到相應的內容,返回負數,而這個location是NSUInteger類型,看起來這個類型是一種無符號整數啊,如何表示檢索不到內容呢?
Objective-C阿姨:有兩種方法可以解決這個問題。一種是判斷length的長度,如果長度為0,表示沒有找到相應的內容,另外一種判斷location是否等於NSNotFound。其實NSNotFound就是NSUInteger的最大值LONG_MAX
C#妹妹:挺經典的,.NET裡用負數表示檢索不到內容,Objective-C裡邊用最大值表示。
Objective-C阿姨:是的,rangeOfString的用法類似這樣
view sourceprint?1 NSString *word=@"tive"; 

2 NSString *str=@"這是Objective-C家的狗狗!"; 

3 NSLog(@"在字符串‘%@’中搜索‘%@’",str,word); 

4 NSRange r=[str rangeOfString:word];//在str中搜索word 返回NSRange 裡邊包含{location和length} 

5 if(r.location==NSNotFound)//這裡判斷if(r.length<=0)也是一樣的 

6     NSLog(@"這句話裡沒有找到%@",word); 

7 else

8     NSLog(@"這句話中從第%lu個字符開始後邊%lu個字符是%@",r.location+1,r.length,word);

rangeOfString還可以有個參數 判斷是否區分大小寫什麼的。比如可以這樣用
view sourceprint?NSRange r=[str rangeOfString:word options:NSCaseInsensitiveSearch];//NSCaseInsensitiveSearch表示不區分大小寫

如果看著還有點暈,再回顧一次Objective-C給對象發送消息的方式吧

另外一個用到的函數
stringWithFormat:功能類似與.NET中的string.Format,也同樣都是類方法,都是用來生成字符串的。用法你看看下面的例子

view sourceprint?NSString *str2=[NSString stringWithFormat:@"%@愛吃%@",@"狗狗",@"包子"];  NSLog(@"%@",str2);//這句話輸出 狗狗愛吃包子


弄明白這兩個方法,現在在看下面的語句應該就明白了吧。

view sourceprint?NSRange r=[@",包子,骨頭,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];


其實是兩個方法的嵌套
先向NSString類發送消息stringWithFormat生成食物名稱的字符串,比如@“,包子,”
然後再向字符串@",包子,骨頭,肉,冰激凌,"其實也就是NSString的實例發送消息rangeOfString檢索@“,包子,”是否包含在字符串@",包子,骨頭,肉,冰激凌,"中。
C#妹妹:好一段糾結的代碼。。。。
Objective-C阿姨:現在就比較一下NSString與.NET中的System.String吧。
 關於字符串長度。
NSString用方法length方法。System.String有Length屬性。兩者都充分考慮到中文字符的問題,不論英文還是中文日本,每個字符長度加1。
關於字符串比較。Objective-C不能用“==”號,比較字符串內容的,“==”保留了原始的引用比較功能。C#已經把“==”處理成比較直觀的內容比較。Objective-C中比較字符串是否相同正確的方法是isEqualToString。
 與.NET的System.String相同,NSString同樣是不可變的
NSString所謂的改變就是生成新的字符串。與.NET的String.Text.StringBuilder一樣,Objective-C提供了NSMutableString,這個類表示的字符串是可以修改的。但是與StringBuilder不同的是,他繼承自NSString,意味著基類的方法,他都可以用。

各位同學,本人學習Objective-C時間很短,學習Objective-C其實不是為了Mac、iPhone開發,並沒有實用,
其實是一個C#用戶學習Objective-C的學習筆記,學習的確切目的是幫助我理解C#,畢竟沒有比較是不可能知道所謂C#的特點的
請大家批判的眼光看這個東西,如果發現和其他文章、書籍、評論、資料有沖突,請盡量以其他文章為准。並給我留言
也邀請所有高手積極拍磚

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved