NSString字符串比較

我想你很快就會在程序中需要比較兩個字符串是否相等。在C中,你知道可以使用strcmp(string1,string2)函數: 

1 char string1[] = "Yo";
2  
3 char string2[] = "Yo";
4  
5 if (strcmp(string1, string2) == 0) {
6  
7   // do the following code
8  
9 }

條件表達式的結果將會是真,從而執行if語句大括號中的代碼。在Cocoa中,也是相類似的。記住,當我們聲明一個字符串NSString *aString; 時,變量 aString並不真正包含一個字符串對象—它是指向內存中字符串對象的指針。我們稱呼這類變量的另一個名稱是對象標識符,因爲它是標識內存中的一個對象而不是保存這個對象。這個技術細節有很重要的含義,指針是一個內存位置的地址。考慮下面我們通過“==”比較兩個字符串對象的情況: 

1 NSString *string1 = @"A String";
2  
3 NSString *string2 = @"A String";

這裏,我們靜態地創建了兩個NSString對象,它們是兩個不同的對象,但它們都包含相同的值。現在,如果我們使用 

C的等號操作符, 

1 BOOL result = string1 == string2;

等號表達式的值將爲“不等”(Objective-C中是“false”)。對,是“不等”。我們看着是相等的,但是這行代碼比較的不是字符串—它比較的是它們內存地址的值。由於它們不是一個相同的對象,它們存在於各自的內存位置,因此string1的地址和string2的並不相同。這說明了表達式的值爲什麼爲假。 

現在,如果我們象下面這麼做: 

1 NSString *string1 = @"A String.";
2  
3 NSString *string2 = string1;
4  
5 BOOL result = string1 == string2;

這次等號操作符將返回 “真”,因爲string1和string2都指向相同的對象的內存位置—它們的地址相同。NSString *string2=string1;這行 把string1的地址存到了string2中。所以現在地址是相等了,就好象我們在等式中表現的一樣。 

現在讓我們歸納一下,如果變量的數據類型是int,double,char或float,等號操作符會如我們想象那麼起作用,因爲這些變量的數據類型不是指針,它們實際上包含了數據的值。只有對象變量(和所有的指針變量)會成爲這一現象的犧牲品。 所以,我希望你習慣有些老方法在面向對象編程中不再適用。我現在將示範怎麼進行比較和相等判斷。 

當你想判斷兩個對象是否相等時,你必須調用相應的類中的比較method。在NSString中,最直接的是- isEqualToString:這個method,它 的參數是一個NSString對象,返回值是一個布爾值表明接收者字符串是否與參數字符串相等。現在,我們可以試驗一下: 

1 NSString *string1 = @"A String.";
2  
3 NSString *string2 = @"A String.";
4  
5 BOOL result = [string1 isEqualToString: string2];

這個語句將返回 “真”,因爲string1和string2指向的對象的值是相等的。一個更通用的method是- compare:,它可以比較字符串時候和接收者的 相等,或者這個字符串是在接收者之前還是之後(按照字典的順序,也就是詞彙順序)。compare:的返回類型是一種稱爲NSComparisonResult的Cocoa數據類型,它有三個可能的值 :NSOrderedAscending,NSOrderedSame,NSOrderedDescending(它們只是在基礎框架中定義的常數,分別等於整數-1,0,1)。 所以,我們可以按照下面的方法使用compare: 

1 NSString *string1 = @"aardvark";
2  
3 NSString *string2 = @"tarsier";
4  
5 BOOL result = [string1 compare: string2] == NSOrderedAscending;

因爲string2在string1的字母順序之後,發給string1的消息將返回NSOrderedAscending,由於我們使用相等操作符來 與NSOrderedAscending進行判斷,所以結果爲“真”。這相當於說string2大於string1。 通過把NSOrderedAscending替換爲NSOrderedSame或NSOrderedDescending,我們可以判斷接收着(string1)是否與參數(string2)相等,或者string2按字母順序排在string1之前。 

在這個系統中,大寫字母小於小寫字母。所以,下面的計算結果爲“真”: 

1 NSString *string1 = @"Aardvark";
2  
3 NSString *string2 = @"aardvark";
4  
5 BOOL result = [string1 compare: string2] == NSOrderedAscending;

這是因爲在詞彙順序上 “Aardvark”在“aardvark”之前(想象一下字典中的單詞排列順序)。如果你想不考慮大小寫地比較字符串,使用-caseInsensitiveCompare:。這個method的使用方法爲(使用與前面一個例子相同的字符串): 

1 BOOL result = [string1 caseInsensitiveCompare: string2] == NSOrderedSame;

結果將爲 “真” 。

這時你可以使用的一些基本的字符串比較 method。如果你需要比這裏講的更多的method,你可以仔細讀一下類的文檔,你可以找到一些給你更大靈活性和選擇的字符串比較method。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章