OC基礎–字符串
前言
做iOS開發有3年了,從當初的小白到現在,斷斷續續看過很多資料,之前也寫過一些博文來記錄,但是感覺知識點都比較凌亂。所以最近準備抽時間把iOS開發的相關知識進行一個梳理,主要分為OC基礎、UI控件、多線程、動畫、網絡、數據持久化、自動布局、第三方框架等幾個模塊進行梳理。本系列的所有博文集合參見:iOS開發知識梳理博文集。本文主要介紹 OC基礎–字符串。
字符串應該是我們開發過程中用的最多的一種數據類型了,一般與後台的請求交互都跟字符串有關,不管是json串還是其他的數據格式,後台提供的絕大部分數據都是以字符串的形式返回的。Objective-C里核心的處理字符串的類就是NSString和NSMutableString這兩個類,這兩個類完成了Objective-C中字符串大部分功能的處理,我們今天的重點就是這兩個類了。(後面內容轉載自:玩轉 NSString)
一 NSString
1.1 字符串屬性
//////////字符串屬性////////// NSString *str1 = @"string"; NSLog(@"長度: %ld", str1.length); NSLog(@"描述: %@", str1.description); NSLog(@"哈希地址: %lu", (unsigned long)str1.hash); NSLog(@"字符串對應下標字符: %c", [str1 characterAtIndex:2]); //輸出: 長度: 6 //輸出: 描述: string //輸出: 哈希地址: 10152471993823965 //輸出: 字符串對應下標字符: r
1.2 字符串截取
//截取指定位置之後的字符串 - (NSString *)substringFromIndex:(NSUInteger)from; //從0下標開始截取到指定位置的字符串 - (NSString *)substringToIndex:(NSUInteger)to; //截取指定範圍的字符串 - (NSString *)substringWithRange:(NSRange)range; //截取字符串指定範圍的字符 - (void)getCharacters:(unichar *)buffer range:(NSRange)range;
1.3 字符串比較
將兩個字符串進行計較,返回NSComparisonResult枚舉結果。
//////////字符串比較////////// //1.比較 - (NSComparisonResult)compare:(NSString *)string; //2.比較(指定字符串,條件) - (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; //3.比較(指定字符串,條件,範圍) - (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange; //4.比較(指定字符串,條件,範圍,本地化) - (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(nullable id)locale; //5.比較(不區分大小寫) - (NSComparisonResult)caseInsensitiveCompare:(NSString *)string; //6.本地化比較 - (NSComparisonResult)localizedCompare:(NSString *)string; //7.本地化比較(不區分大小寫) - (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string; //8.本地化比較(標準) - (NSComparisonResult)localizedStandardCompare:(NSString *)string; //9.判斷兩個字符串是否內容一致 - (BOOL)isEqualToString:(NSString *)aString;
比較結果說明:
NSComparisonResult | 說明 |
---|---|
NSOrderedAscending | 升序 (左小右大) |
NSOrderedSame | 相同 (內容相同) |
NSOrderedDescending | 降序 (左大右小) |
比較選項說明:
NSStringCompareOptions | 說明 |
---|---|
NSCaseInsensitiveSearch | 不區分大小寫比較 |
NSLiteralSearch | 區分大小寫比較 |
NSBackwardsSearch | 從字符串末尾開始搜索 |
NSAnchoredSearch | 搜索限制範圍的字符串 |
NSNumericSearch | 按照字符串里的數字為依據,算出順序 |
NSDiacriticInsensitiveSearch | 忽略 “-” 符號的比較 |
NSWidthInsensitiveSearch | 忽略字符串的長度,比較出結果 |
NSForcedOrderingSearch | 忽略不區分大小寫比較的選項 |
NSRegularExpressionSearch | 只能應用於 rangeOfString:…, stringByReplacingOccurrencesOfString:…和 replaceOccurrencesOfString:…方法 |
1.4 字符串搜索
//////////搜索基本////////// //1.是否包含前綴(以str開頭) - (BOOL)hasPrefix:(NSString *)str; //2.是否包含後綴(以str結尾) - (BOOL)hasSuffix:(NSString *)str; //3.獲取公共前綴 - (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask; //4.是否包含字符串 - (BOOL)containsString:(NSString *)str; //5.本地化是否包含字符串(不區分大小寫) - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str; //6.本地化是否包含字符串(標準) - (BOOL)localizedStandardContainsString:(NSString *)str; //7.本地化搜索字符串範圍(標準) - (NSRange)localizedStandardRangeOfString:(NSString *)str; //////////搜索字符串////////// //8.搜索(指定字符串) - (NSRange)rangeOfString:(NSString *)searchString; //9.搜索(指定字符串,條件) - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask; //10.搜索(指定字符串,條件,範圍) - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange; //11.搜索(指定字符串,條件,範圍,本地化) - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(nullable NSLocale *)locale; //////////搜索字符集合////////// //12.搜索(指定字符集合) - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet; //13.搜索(指定字符集合,條件) - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask; //14.搜索(指定字符集合,條件,範圍) - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask range:(NSRange)searchRange; //15.用字符串的字符編碼指定索引查找位置 - (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index; //16.用字符串的字符編碼指定區域段查找位置 - (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range;
1.5 字符串拼接
//////////字符串拼接////////// NSString *string = @"1"; NSString *appStr = @"2"; NSString *resultStr1 = [string stringByAppendingString:appStr]; NSString *resultStr2 = [string stringByAppendingFormat:@" + %@", appStr]; NSLog(@"普通拼接: %@", resultStr1); NSLog(@"格式化拼接: %@", resultStr2); //輸出: 普通拼接: 12 //輸出: 格式化拼接: 1 + 2
1.6 字符串基本類型轉換
//////////字符串基本類型轉換////////// NSString *numStr = @"87234.2345"; NSLog(@"double型: %f", numStr.doubleValue); NSLog(@"float型: %f", numStr.floatValue); NSLog(@"int型: %d", numStr.intValue); NSLog(@"NSInteger型: %ld", numStr.integerValue); NSLog(@"long long型: %lld", numStr.longLongValue); NSLog(@"BOOL型: %d", numStr.boolValue); //輸出: double型: 87234.234500 //輸出: float型: 87234.234375 //輸出: int型: 87234 //輸出: NSInteger型: 87234 //輸出: long long型: 87234 //輸出: BOOL型: 1
1.7 字符串大小寫轉換
//////////字符串大小寫轉換////////// NSString *string = @"string"; NSLog(@"大寫: %@", string.uppercaseString); NSLog(@"小寫: %@", string.lowercaseString); NSLog(@"首字母大寫: %@", string.capitalizedString); //輸出: 大寫: STRING //輸出: 小寫: string //輸出: 首字母大寫: String //本地化(大寫) - (NSString *)uppercaseStringWithLocale:(nullable NSLocale *)locale; //本地化(小寫) - (NSString *)lowercaseStringWithLocale:(nullable NSLocale *)locale; //本地化(首字母大寫) - (NSString *)capitalizedStringWithLocale:(nullable NSLocale *)locale;
1.8 字符串分行,分段
//////////分行////////// //1.指定範圍,分行取字符串 - (void)getLineStart:(nullable NSUInteger *)startPtr end:(nullable NSUInteger *)lineEndPtr contentsEnd:(nullable NSUInteger *)contentsEndPtr forRange:(NSRange)range; //2.獲取指定範圍該行的範圍 - (NSRange)lineRangeForRange:(NSRange)range; //////////分段////////// //3.指定範圍,分段取字符串 - (void)getParagraphStart:(nullable NSUInteger *)startPtr end:(nullable NSUInteger *)parEndPtr contentsEnd:(nullable NSUInteger *)contentsEndPtr forRange:(NSRange)range; //4.獲取指定範圍該段落的範圍 - (NSRange)paragraphRangeForRange:(NSRange)range; //////////字符串分行,分段////////// NSString *string = @"123 456\nABC,DEF\nabc.def"; //獲取該行的範圍(指定範圍) NSRange range1 = [string lineRangeForRange:NSMakeRange(0, 10)]; NSLog(@"%ld 行長度: %ld", range1.location, range1.length); //輸出: 0 行長度: 16 //獲取該段落範圍(指定範圍) NSRange range2 = [string paragraphRangeForRange:NSMakeRange(0, 3)]; NSLog(@"%ld 段落長度: %ld", range2.location, range2.length); //輸出: 0 段落長度: 8
1.9 字符串列舉(按條件)
//////////字符串列舉////////// NSString *string = @"123456\nABCDEF\nabcdef //1.列舉(按行) [string enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) { NSLog(@"每行: %@", line); }]; //輸出: 每行: 123456 //輸出: 每行: ABCDEF //輸出: 每行: abcdef //2.列舉(範圍,條件) [string enumerateSubstringsInRange:NSMakeRange(5, 10) options:NSStringEnumerationByLines usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) { NSLog(@"%@", substring); NSLog(@"%ld %ld", substringRange.location, substringRange.length); NSLog(@"%ld %ld", enclosingRange.location, enclosingRange.length); }]; //輸出: 6 //輸出: 5 1 //輸出: 5 2 //輸出: ABCDEF //輸出: 7 6 //輸出: 7 7 //輸出: a //輸出: 14 1 //輸出: 14 1
列舉選項:
NSStringEnumerationOptions | 說明 |
---|---|
NSStringEnumerationByLines | 按行 |
NSStringEnumerationByParagraphs | 按段落 |
NSStringEnumerationByComposedCharacterSequences | 按字符順序 |
NSStringEnumerationByWords | 按單詞,字 |
NSStringEnumerationBySentences | 按句子 |
NSStringEnumerationReverse | 反向遍歷 |
NSStringEnumerationSubstringNotRequired | 不需要子字符串 |
NSStringEnumerationLocalized | 本地化 |
1.10 字符串編碼和轉換
//////////字符串編碼和轉換////////// NSString *string = @"string"; NSLog(@"最快編碼值(枚舉): %lu", (unsigned long)string.fastestEncoding); NSLog(@"最小編碼值(枚舉): %lu", (unsigned long)string.smallestEncoding); NSLog(@"UTF8編碼值: %s", string.UTF8String); //輸出: 最快編碼值(枚舉): 1 //輸出: 最小編碼值(枚舉): 1 //輸出: UTF8編碼值: string
//1.選擇編碼,是否允許有損編碼 - (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy; //2.選擇編碼 - (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding; //3.判斷是否可以無損編碼 - (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding; //4.C字符編碼轉換 - (nullable __strong const char *)cStringUsingEncoding:(NSStringEncoding)encoding; //5.判讀C字符轉化是否可以成功 - (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding; //6.指定緩存區轉換 - (BOOL)getBytes:(nullable void *)buffer maxLength:(NSUInteger)maxBufferCount usedLength:(nullable NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(nullable NSRangePointer)leftover; //7.對字符串進行編碼時所需的最大位元組數 - (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc; //8.對字符串進行編碼時所需的位元組數 - (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc; //9.可用字符串編碼 + (const NSStringEncoding *)availableStringEncodings; //10.本地化編碼名稱 + (NSString *)localizedNameOfStringEncoding:(NSStringEncoding)encoding; //11.默認C字符串編碼 + (NSStringEncoding)defaultCStringEncoding;
1.11 字符串分割
//////////字符串分割////////// NSString *string = @"A_B_c_D_E_F"; //分割(指定字符串) NSArray *resultArr1 = [string componentsSeparatedByString:@"_"]; NSLog(@"%@", resultArr1); //輸出: (A, B, c, D, E, F) //分割(指定字符集合) NSArray *resultArr2 = [string componentsSeparatedByCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]]; NSLog(@"%@", resultArr2); //輸出: ("A_B_" , "_D_E_F")
字符集合:
NSCharacterSet | 說明 |
---|---|
controlCharacterSet | 控制符 |
whitespaceCharacterSet | 空格符 |
whitespaceAndNewlineCharacterSet | 空格換行符 |
decimalDigitCharacterSet | 小數 |
letterCharacterSet | 文字 |
lowercaseLetterCharacterSet | 小寫字母 |
uppercaseLetterCharacterSet | 大寫字母 |
nonBaseCharacterSet | 非基礎 |
alphanumericCharacterSet | 數字字母 |
decomposableCharacterSet | 可分解 |
illegalCharacterSet | 非法 |
punctuationCharacterSet | 標點 |
capitalizedLetterCharacterSet | 大寫 |
symbolCharacterSet | 符號 |
newlineCharacterSet | 換行符 |
NSString *string = @"3EWRs a;af"; //////////修剪////////// NSString *result1 = [string stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]]; NSLog(@"%@", result1); //輸出: 3EWRs a; //////////填充////////// NSString *result2 = [string stringByPaddingToLength:20 withString:@"填充" startingAtIndex:1]; NSLog(@"%@", result2); //輸出: 3EWRs a;af充填充填充填充填充填 //////////摺疊////////// NSString *result3 = [string stringByFoldingWithOptions:NSNumericSearch locale:[NSLocale systemLocale]]; NSLog(@"%@", result3); //輸出: 3EWRs a;af //////////替換////////// //替換(指定字符串) NSString *result4 = [string stringByReplacingOccurrencesOfString:@" " withString:@"替換"]; NSLog(@"%@", result4); //輸出: 3EWRs替換a;af //替換(指定字符串,條件,範圍) NSString *result5 = [string stringByReplacingOccurrencesOfString:@"a" withString:@"替換" options:NSRegularExpressionSearch range:NSMakeRange(0, string.length - 2)]; NSLog(@"%@", result5); //輸出: 3EWRs 替換;af //替換(指定範圍) NSString *result6 = [string stringByReplacingCharactersInRange:NSMakeRange(0, string.length) withString:@"替換"]; NSLog(@"%@", result6); //輸出: 替換
1.13 字符串翻譯
//////////字符串翻譯////////// NSString *dalian = @"大連"; NSString *result = [dalian stringByApplyingTransform:NSStringTransformMandarinToLatin reverse:NO]; NSLog(@"%@", result); //輸出: dà lián
翻譯選項:
翻譯選擇 | 說明 |
---|---|
NSStringTransformLatinToKatakana | 拉丁->片假名 |
NSStringTransformLatinToHiragana | 拉丁->平假名 |
NSStringTransformLatinToHangul | 拉丁->韓語 |
NSStringTransformLatinToArabic | 拉丁->阿拉伯語 |
NSStringTransformLatinToHebrew | 拉丁->希伯來語 |
NSStringTransformLatinToThai | 拉丁->泰國 |
NSStringTransformLatinToCyrillic | 拉丁->西里爾字母 |
NSStringTransformLatinToGreek | 拉丁->希臘 |
NSStringTransformToLatin | 拉丁 |
NSStringTransformMandarinToLatin | 普通話->拉丁 |
NSStringTransformHiraganaToKatakana | 平假名->片假名 |
NSStringTransformFullwidthToHalfwidth | 全角->半角 |
NSStringTransformToXMLHex | XML16進制 |
NSStringTransformToUnicodeName | Unicode名 |
NSStringTransformStripCombiningMarks | 結合地帶商標 |
NSStringTransformStripDiacritics | 帶音符 |
1.14 字符串寫入
//////////字符串寫入////////// //寫入到指定路徑,編碼的文件中 [string writeToFile:@"/Users/Desktop/LuisX.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; //寫入到指定URL,編碼的文件中 [string writeToURL:[NSURL URLWithString:@"file://LuisX.text"] atomically:YES encoding:NSUTF8StringEncoding error:nil];
二 NSMutableString
NSMutableString是動態的字符串,可以動態的添加,修改,刪除等,並且NSMutableString繼承自NSString,所以NSString中的方法在NSMutableString都可以使用。
2.1 可變字符串分配容量
提前指定的容量,知識用於內存優化,實際大小可以大於設置的容量capacity
//////////字符串分配容量////////// //1.初始化容量為Capacity大小的字符串 (需要手動釋放內存) NSMutableString *mutableStr1 = [[NSMutableString alloc] initWithCapacity:20]; //2.初始化容量為Capacity大小的字符串 (不需要手動釋放內存) NSMutableString *mutableStr2 = [NSMutableString stringWithCapacity:20];
2.2 可變字符串擴展方法
NSMutableString *str = [NSMutableString stringWithString:@"string"]; //////////插入////////// [str insertString:@"123" atIndex:2]; NSLog(@"%@", str); //輸出: st123ring //////////刪除////////// [str deleteCharactersInRange:NSMakeRange(2, 2)]; NSLog(@"%@", str); //輸出: st3ring //////////拼接////////// [str appendString:@"456"]; NSLog(@"%@", str); //輸出: st3ring456 //////////格式化拼接////////// [str appendFormat:@"7 89"]; NSLog(@"%@", str); //輸出: st3ring4567 89 //////////設置新字符串////////// [str setString:@"string"]; NSLog(@"%@", str); //輸出: string //////////字符串替換////////// //1.指定範圍替換 [str1 replaceCharactersInRange:NSMakeRange(2, 2) withString:@"123"]; NSLog(@"%@", str1); //輸出: st123ng //2.指定字符串,條件,範圍替換 [str1 replaceOccurrencesOfString:@"123" withString:@"--" options:NSRegularExpressionSearch range:NSMakeRange(0, str1.length)]; NSLog(@"%@", str1); //輸出: st--ng