這裏要介紹的第一個真正的類是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”.