天天看點

Objective-C的Foundation架構——字元串NSString0x01 建立字元串0x02 字元串長度0x03 字元串的比較0x04 可變字元串NSMutableString

這裡要介紹的第一個真正的類是NSString,也就是Cocoa中用來處理字元串的類。

0x01 建立字元串

NSstring的stringWithFormat:方法通過格式化字元串和一些參數來輸出格式化的結果來建立NSString。

+ (id) stringWithFormat: (NSString *) format, ...;
//最後的省略号表示這個方法可以接受多個以逗号隔開的其他參數
//類似printf()和NSLog()

//如果按如下方式建立一個新的字元串
NSString *height;
height = [NSString stringWithFormat:@"Your height is %d feet, %d inches", 5, 11];
//得到的字元串将是“Your height is 5 feet, 11 inches”
           

0x02 字元串長度

NSString中有個執行個體方法length,傳回的是字元串中的字元個數。

- (NSUInteger) length;

//使用方法一:
NSUInteger length = [height length];

//使用方法二,直接用在表達式裡:
if ([height length] > 35)
{
  NSLog (@"wow, you're really tall!");
}
           

0x03 字元串的比較

NSString提供了幾個用于字元串間比較的方法。

isEqualToString

isEqualToString:方法可以用來比較接收消息的對象和作為參數傳遞過來的字元串,傳回一個BOOL值來表示兩個字元串是否相同。

- (BOOL) isEqualToString: (NSString *) aString;

NSString *thing1 = @"hello 5";                                    //直接指派
NSString *thing2 = [NSString stringWithFormat: @"hello %d", 5];   //通過格式字元串建立
if ([thing1 isEqualToString: thing2])
{
  NSLog (@"They are the same!");
}
           

比較兩個字元串是否相同必須使用isEqualToString:方法!

如果使用if(thing1 == thing2),這裡的==運算符隻會判斷thing1和thing2的指針值是否相等,而不是它們所指的對象是否相等。

要記住,Objective-C裡的所有對象間的互動都是通過指針來完成的。

compare

compare:方法将接收對象和傳遞來的字元串逐個進行比較(區分大小寫),傳回一個NSComparisonResult(這是一個enum型枚舉)來顯示比較的結果。

- (NSComparisonResult) compare: (NSString *) aString;

//NSComparisonResult的enum枚舉
enum {
  NSOrderedAscending = -1,
  NSOrderedSame,
  NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
           

compare:options:方法使字元串比較可以有更多的選擇。

options參數是一個掩位碼,可以使用 | 運算符來添加選項标記,常用選項如下:

  • NSCaseInsensitiveSearch:不區分大小寫字元;
  • NSLiteralSearch:進行完全比較,區分大小寫字元;
  • NSNumericSearch:比較字元串的字元個數,而不是字元串值,如果不添加這個選項,100就會排在99前面。
if ([thing1 compare: thing2 options: NSCaseInsensitiveSearch | NSNumericSearch]
    == NSOrderedSame)
{
  NSLog (@"They match!");
}
           

hasPrefix and hasSuffix

hasPrefix:方法用于檢查字元串是否以另一個字元串開頭;

hasSuffix:方法用于檢查字元串是否以另一個字元串結尾。

- (BOOL) hasPrefix: (NSString *) aString;
- (BOOL) hasSuffix: (NSString *) aString;

NSString *fileName = @"draft-chapter.pages";
if ([fileName hasPrefix: @"draft"])
{
  // this is a draft
}
if ([fileName hasSuffix: @".mov"])
{
  // this is a movie
}
           

rangeOfString

将rangeOfString:發送給一個NSString對象時,傳遞的參數是要查找的字元串。它将傳回一個NSRange結構體,說明與被傳遞字元串相比對的部分在哪裡以及能夠比對上的字元個數。

如果沒有找到對應的部分,range.location的值為NSNotFound。

- (NSRange) rangeOfString: (NSString *) aString;

//示例
NSRange range = [fileName rangeOfString: @"chapter"];
           

0x04 可變字元串NSMutableString

stringWithCapacity

NSString是不可變字元串,Cocoa提供了一個NSString的子類NSMutableString,它是可變字元串。

由于NSMutableString是NSString的子類,是以可以繼承NSString的所有特性:

1、任何使用NSString的地方,都可以用NSMutableString代替;

2、NSString中非常友善的類方法stringWithFormat:也可以用來建立NSMutableString對象。

可以使用類方法stringWithCapacity:來建立一個新的NSMutableString。參數capacity是記憶體容量,這個容量隻是給編譯器一個建議值,實際可以超過其大小:

+ (id) stringWithCapacity: (NSUInteger) capacity;

//示例
NSMutableString *string = [NSMutableString stringWithCapacity:42];
NSMutableString *string = [NSMutableString stringWithFormat: @"jo%dy", 2];
           

appendString and appendFormat

appendString:接收參數aString,然後将其複制到接收對象末尾。

appendFormat:工作方式與stringWithFormat:類似,但沒有建立新的字元串,隻是将格式化的字元串附加在了接收字元串的末尾。

- (void) appendString: (NSString *) aString;
- (void) appendFormat: (NSString *) format, ...;

//示例
NSMutableString *string = [NSMutableString stringWithCapacity:50];
[string appendString: @"Hello there "];
[string appendFormat: @"human %d!", 39];

//string will have the friendly value “Hello there human 39!”.
           

deleteCharactersInRange

deleteCharactersInRange:方法用于删除字元串中的字元,可以和rangeOfString:連在一起使用。

- (void) deleteCharactersInRange: (NSRange) aRange;

//示例
NSMutableString *friends = [NSMutableString stringWithCapacity:50];
[friends appendString: @"James BethLynn Jack Evan"];

//find the range of characters where Jack lives:
NSRange jackRange = [friends rangeOfString: @"Jack"];
jackRange.length++; // eat the space that follows

//remove “Jack”
[friends deleteCharactersInRange: jackRange];

//This leaves the string as “James BethLynn Evan”.