我想你很快就會在程序中需要比較兩個字符串是否相等。在C中,你知道可以使用strcmp(string1,string2)函數:
5 |
if ( strcmp (string1,
string2) == 0) { |
條件表達式的結果將會是真,從而執行if語句大括號中的代碼。在Cocoa中,也是相類似的。記住,當我們聲明一個字符串NSString *aString; 時,變量 aString並不真正包含一個字符串對象—它是指向內存中字符串對象的指針。我們稱呼這類變量的另一個名稱是對象標識符,因爲它是標識內存中的一個對象而不是保存這個對象。這個技術細節有很重要的含義,指針是一個內存位置的地址。考慮下面我們通過“==”比較兩個字符串對象的情況:
1 |
NSString
*string1 = @ "A
String" ; |
3 |
NSString
*string2 = @ "A
String" ; |
這裏,我們靜態地創建了兩個NSString對象,它們是兩個不同的對象,但它們都包含相同的值。現在,如果我們使用
C的等號操作符,
1 |
BOOL result
= string1 == string2; |
等號表達式的值將爲“不等”(Objective-C中是“false”)。對,是“不等”。我們看着是相等的,但是這行代碼比較的不是字符串—它比較的是它們內存地址的值。由於它們不是一個相同的對象,它們存在於各自的內存位置,因此string1的地址和string2的並不相同。這說明了表達式的值爲什麼爲假。
現在,如果我們象下面這麼做:
1 |
NSString
*string1 = @ "A
String." ; |
3 |
NSString
*string2 = string1; |
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." ; |
3 |
NSString
*string2 = @ "A
String." ; |
5 |
BOOL result
= [string1 isEqualToString: string2]; |
這個語句將返回 “真”,因爲string1和string2指向的對象的值是相等的。一個更通用的method是- compare:,它可以比較字符串時候和接收者的 相等,或者這個字符串是在接收者之前還是之後(按照字典的順序,也就是詞彙順序)。compare:的返回類型是一種稱爲NSComparisonResult的Cocoa數據類型,它有三個可能的值 :NSOrderedAscending,NSOrderedSame,NSOrderedDescending(它們只是在基礎框架中定義的常數,分別等於整數-1,0,1)。
所以,我們可以按照下面的方法使用compare:
1 |
NSString
*string1 = @ "aardvark" ; |
3 |
NSString
*string2 = @ "tarsier" ; |
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" ; |
3 |
NSString
*string2 = @ "aardvark" ; |
5 |
BOOL result
= [string1 compare: string2] == NSOrderedAscending; |
這是因爲在詞彙順序上 “Aardvark”在“aardvark”之前(想象一下字典中的單詞排列順序)。如果你想不考慮大小寫地比較字符串,使用-caseInsensitiveCompare:。這個method的使用方法爲(使用與前面一個例子相同的字符串):
1 |
BOOL result
= [string1 caseInsensitiveCompare: string2] == NSOrderedSame; |
結果將爲 “真” 。
這時你可以使用的一些基本的字符串比較 method。如果你需要比這裏講的更多的method,你可以仔細讀一下類的文檔,你可以找到一些給你更大靈活性和選擇的字符串比較method。