Objective-C學習篇06—NSString與NSMutableString,objectivecnsstring
NSString
OC提供了定義字串對象的方法,也就是將想要表達的字串用一對雙引號引起來,並在開頭加上@.@是OC中的指令符,它告訴編譯器@以後的內容為OC中的文法.比如@”Harbingwang”表示的是一個NSString類型的常量.
NSString 是一個不可變的字串類,繼承自 NSObject ,用NSString建立出來的字串對象,一經建立就不能再修改了.我們可以對它執行尋找或比較等操作,但是不能通過增加,刪除它的字元來動態地改變它.
NSString主要的方法都在Foundation/NSString.h中定義的,NSString提供了很多方法的介面,但是這些方法的實現都是由內部具體實現的.下面將對NSString的主要方法進行說明:
1. 快速建立字串對象
NSString *str = @"叔叔約嗎?";
2. 產生指定格式的字串
格式化建立字串 initWithFormat:
便利構造器方法建立 stringWithFormat:
NSString *str = [[NSString alloc] initWithFormat:@"name:%@ age:%ld, name, age];
NSString *str = [NSString stringWithFormat:@"name:%@ age:%ld, name, age];
練習:將字串@"2015.11.18"和@"2016.1.1"初始化為一個新的字串@"2015.11.18--2016.1.1"
NSString *date = [NSString stringWithFormat:@"%@%@%@", @"2015.11.18", @"--", @"2016.1.1"];
3. 將C語言中的字串轉換為OC中的字串對象 initWithUTF8String:
NSString *str = [NSString alloc] initWithUTF8String:"iOS"];
4. 使用檔案中的常值內容以指定編碼格式建立字串對象 initWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing *)#>
第一個參數: 檔案路徑
第二個參數: 編碼格式 NSUTF8StringEncoding 8位Unicode編碼 適用於使用中文的編碼格式
第三個參數: 如果出錯, 這個參數用來儲存報錯資訊,一般填nil
NSString *str = [[NSString alloc] initWithContentsOfFile:@"/Users/Desktop/Product/OC/Lesson/OCLessonNSString-04/OCLessonNSString-04/Harbingwang.txt" encoding:NSUTF8StringEncoding error:nil];
對應的便利構造器 stringWithContentsOfFile: encoding: error:
5. 計算字串的長度 length
NSString *string = @"iPhone6splus買"; // 無論是數字,英文還是漢字,都是按一個字元來算NSUInteger length = string.length; //可以使用點文法NSLog(@"%lu", length);
首先在這裡補充兩點:
1.父串與子串的概念: A串中存在連續的多個字元和B字串相同,A是B的父串,B是A的子串
2. NSRang 是一個表示範圍的結構體,其中包括了資料的首地址location和資料長度legth
typedef struct _NSRange {NSUInteger location; // 起始位置NSUInteger length; // 從起始位置開始取多長} NSRange;
6.字串的截取
substringWithRange:
// a. 返回一個新字串,新字串開始的位置和長度由Rang決定
NSRange rang = {12, 1};
NSString *string = [string substringWithRange:rang];
substringToIndex:
// b. 擷取 從0開始到某個位置 的字串,但是 不包括提供位置的字元
NSString *substring = [string substringToIndex:5];
NSLog(@"%@", substring); // 返回的是新的字串對象.所以用 %@ 佔位
substringFromIndex:
// c. 擷取從某個位置開始到結尾的子串,包含提供位置的字元
NSString *substring = [string substringFromIndex:5];
NSLog(@"%@", substring);
7.字串的檢索
rangeOfString:// 返回一個新字串,新字串開始的位置和長度由Rang決定NSString *string = @"iloveyou";// 有如上字串,想得到子串 'love'在string4中的範圍NSRange rang1 = [string rangeOfString:@"love"];NSLog(@"%lu %lu", rang1.location, rang1.length);
8.字串的拼接
stringByAppendingFormat: //格式化拼接字串(可以拼接多個)
NSString *string1 = @"iOS";NSString *string2 = @"開發";
NSString *newString = [string1 stringByAppendingFormat:@"%@", string2];stringByAppendingString:// 拼接字元竄(只能拼接一個)
NSString *newString2 = [String1 stringByAppendingString:@"入門基礎"];// 列印iOS入門基礎
9.字串的替換
stringByReplacingOccurrencesOfString: withString:// 將目標字串從父串中替換為我們給定的字串// 找到目標字串就返回,找不到就返回原串// 例如: newString iOS開發入門基礎 把 iOS 替換為 AndroidNSString *newString1 = [newString2 stringByReplacingOccurrencesOfString:@"iOS" withString:@" Android"];stringByReplacingCharactersInRange: withString:// 根據提供的字串範圍進行替換
NSRange rang2 = {0, 2};NSString *newString4 = [newString3 stringByReplacingCharactersInRange:rang2 withString:@"dong"];
10.判斷
hasPrefix: // 判斷一個字串是否具有某個首碼 NSString *str15 = @"iOS開發基礎";BOOL isHas = [str15 hasPrefix:@"iOS"];// hasPrefix返回的是一個BOOL值NSLog(@"%@", isHas ? @"有這個首碼" : @"沒有這個首碼"); hasSuffix: //判斷一個字串是否具有某個尾碼 isHas = [str15 hasSuffix:@"3G學院"];NSLog(@"%@", isHas ? @"有這個尾碼" : @"沒有這個尾碼");
isEqualToString:
// 判斷兩個字串對象是否相等
NSString *str1 = @"iOS";
NSString *str2 = @"開發";
BOOL isSame = [str1 isEqualToString:str2];
NSLog(@"%@", isSame ? @"相同" : @"不相同");
// 練習
判斷字串 @"HarbingWang"是否具有@".jpg"的尾碼,如果沒有就為其拼接上一個@".jpg",如果有就將@".jpg"替換為@".png"NSString *str = @"HarbingWang";
BOOL isHasJpg = [str16 hasSuffix:@".jpg"];
NSString *newStr = isHasJpg ? [str16 stringByReplacingOccurrencesOfString:@".jpg" withString:@".png"] : [str16 stringByAppendingString:@".jpg"];NSLog(@"%@", newStr);
11. 比較
比較兩個字串的大小(區分大小寫) compare:
我們先來看下一下它在API中的聲明:
- (NSComparisonResult)compare:(NSString *)string;// 傳回值為: NSComparisonResult 是一個枚舉類型的值,用於顯示比較結果enum { NSOrderedAscending = -1, // 升序,前一個小於後一個 NSOrderedSame, // 相同,前後相同 NSOrderedDescending // 降序,前一個大於後一個};typedef NSInteger NSComparisonResult;
compare方法:
將接收對象和傳遞進來的字串進行逐個字元比較,返回一個NSComparisonResult來顯示比較的結果,如果返回的是NSOrderedAscending那麼前一個數值小於後一個數值,按升序排列. 例如:比較NBA與nba的大小
NSString *str18 = @"NBA"; NSString *str19 = @"nba"; NSComparisonResult n = [str18 compare:str19]; switch (n) {
case NSOrderedAscending: NSLog(@"%@ < %@", str18, str19); break; case NSOrderedSame: NSLog(@"%@ == %@", str18, str19); break; case NSOrderedDescending: NSLog(@"%@ > %@", str18, str19); break; default: break; } NSLog(@"%ld", n);
// 不區分大小寫比較 caseInsensitiveCompare:
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
NSComparisonResult 傳回值同上,為枚舉值
NSComparisonResult m = [str11 caseInsensitiveCompare:str12];NSLog(@"%ld", m); // 輸出 0 表示str11和str12相同,不區分大小寫,複合實際情況
NSMutableString
NSMutableString 可變字串,繼承自NSString,所以 NSMutableString 可以用它父類所有的執行個體變數和方法,該類建立的字串是一個可變字串,可以支援增刪查改等動態操作.一般在項目開發中鼓勵使用NSMutableString類
1. 執行個體對象的產生和初始化 initWithCapacity:
便利構造器方法 stringWithCapacity:
NSMutableString *mStr = [[NSMutableString alloc] initWithCapacity:0];
NSMutableString *mStr1 = [[NSMutableString stringWithCapacity:0];
初始化一個NSMutableString類型的對象,Capacity 容量的意思,指明了要被初始化的NSMutableString對象的大小. NSMutableString的對象會隨著字串的變化而自動擴充記憶體,如果存放的內容小於這個空間,則可以直接放入,如果大於虛擬空間就繼續開闢新的空間.
2. 可變字串的快捷建立方式 .mutableCopy
NSMutableString *mStr3 = @"i am a good student".mutableCopy; //mutableCopy將常量區的內容拷貝一份放到堆區
3.追加字串
在末尾追加一個字串 appendString:
在末尾追加一個格式化字串 appendFormat:
NSMutableString *mutalbeStr = [NSMutableString stringWithFormat:@"My age is 10 "];[mutalbeStr appendString:@"11 12"]; // appendString方法沒有傳回值,說明是直接在str字串後面進行拼接NSLog(@"%@",mutalbeStr); // 列印:My age is 10 11 12// 不可變數組中也提供了拼接的方法,我們不妨對比下:NSString *str = [NSString stringWithFormat:@"My age is 10 "];NSString *str2 = [str stringByAppendingString:@"11 12"];NSLog(@"%@",str2); // 列印:My age is 10 11 12
可以看出:NSString一旦定義了str字串它本身就不可變了,雖然NSString類方法也提供了拼接的方法如stringByAppendString方法但是它返回的是一個新的字串。而NSMutableString提供的拼接方法appendString方法是在原有的字串上直接拼接它沒有傳回值。這就是可變和不可變字串的本質
4. 插入字串的方法 insertString: atIndex:
[mStr4 insertString:@"部落格園" atIndex:0];NSLog(@"%@", mStr4);
5. 根據範圍刪除子串 deleteCharactersInRange:
// 建立一個表示範圍的結構體變數NSRange rang3 = NSMakeRange(0, 2);// 根據範圍刪除子串 deleteCharactersInRange:[(父串) deleteCharactersInRange:rang3];NSLog(@"%@", mStr2);
6. 給字串對象賦值,將aString複製一份,將其設定為訊息接受者的內容 setString
7. 關於大小寫
7.將字串的每個字元全部大寫 uppercaseString//將字串mStr3的每個字元都大寫NSString *upString = [mStr3 uppercaseString];//可以直調用方法,也可以使用點文法NSString *upString = mStr3.uppercaseString; 8. 將字串的每個字元全部小寫 lowercaseStringNSString *lowString = mStr3.lowercaseString;9. 將lowString的單詞的首字母都大寫 capitalizedString
NSString *capitonString = mStr3.capitalizedString;