前言
public struct String
public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
-
Swift 語言主要使用 String 和 Character 來存儲字符數據。String 是字符串類型,Character 是字符類型,一個或多個字符組成一個字符串。
-
String :
-
Swift 語言中的 String 類型與經典 Cocoa 或 Cocoa Touch 框架中的 Foundation NSString 類型進行了無縫銜接,Swift 語言中的 String 類型實現了 NSString 的大部分屬性和方法,字符串搜索、拷貝、插入、刪除等操作都有相應的 API 函數可以使用。
-
String 類型可以調用 NSString 類型的屬性和方法,但是 NSString 類型不可以調用 String 類型獨有的方法。並且以往框架中的任何要求使用 NSString 類型作為參數的函數,都可以使用 String 類型來替換,Swift 語言會自動將 String 類型轉換為 NSString 類型。
-
Swift 語言中可以用 as 將 NSString 類型字符串轉換為 String 類型。
- 如:
var str:String = (NSString(string: "beijing") as String)
- 如:
-
Swift 語言中 String 類型聲明為變量就可以被修改。而在 OC 中,需要通過選擇 NSString 和 NSMutableString 來指定字符串是否可以被修改。
-
Swift 語言中不能直接將字符串當作字符數組那樣通過使用下標訪問指定字符。
-
Swift 語言支持字符串插值,你可以在長字符串中插入常量、變量、字面量和表達式,而不用經過特殊的轉換,這使得創建用於展示、存儲和打印的自定義字符串變的輕松自如。插入的值放在 “ ( ) ” 的括號中。
- 如:
let gameName = "2048"; print("hello my program name is \(gameName)")
- 如:
-
Swift 語言使用值傳遞作為默認字符串拷貝方式,無論何時,傳遞的都是值的拷貝,當我們對 String 類型的變量或者常量進行賦值操作或當作函數/方法的參數傳遞時,這個變量或者常量的值會被拷貝,然后使用這個拷貝出的值進行賦值或者當作參數傳遞。
-
Swift 語言由於沒有 length 屬性,統計字符個數需要使用新的方法,在 Swift 2.2 中使用
characters.count
獲取字符串中字符數量。NSString 的 length 屬性在被 Swift 的 String 值訪問時會被轉換為 utf16count。所以 lrngth 屬性是基於 UTF-16 表示的十六位 code units 數量,而不是基於 Unicode 字符,所以通過 count 返回的字符串數量並不總是與相同字符的 NSString 的 length 屬性值相同。- 如:
let str = "hello world"; print( str.characters.count )
- 如:
-
-
Character :
-
由於全面支持 Unicode 字符,每一個字符值代表一個 Unicode 字符,在 Swift 語言中表示字符使用 Character 類型。
-
Swift 語言聲明字符時需要加上類型名稱,否則會被推斷為 String 類型。
- 如:
var doller:Character = "$"
- 如:
-
1、字符串的輸出
let num:Int = 123
// 直接輸出 自動換行
print(num)
// 使用字符串插值輸出 自動換行 輸出常量或變量
print("\(num)")
// 使用強制類型轉換輸出 自動換行 輸出常量或變量
print(String(num))
// 使用輸出控制符輸出 自動換行 且輸出時間等信息 輸出常量或變量
NSLog("%d", num)
// 使用字符串插值輸出 自動換行 且輸出時間等信息 輸出常量或變量
NSLog("\(num)")
// 使用強制類型轉換輸出 自動換行 且輸出時間等信息 輸出常量或變量
NSLog(String(num))
2、字符串的創建
// String 型字符串的創建
// 創建字符變量,必須指明為 Character 類型,否則會被自動推斷為 String
let str1:Character = "I"
// 創建字符串變量,指明變量類型,未初始化
let str2:String
// 創建字符串變量,指明變量類型,並賦值
let str3:String = "I Love China"
// 創建字符串變量,未指明變量類型,自動推斷為 String 類型
let str4 = "Hello World"
// 直接通過另一個字符串創建,與 str3 的地址不同,是值復制
let str5:String = str3
// NSString 型字符串的創建
// 直接創建 NSString 類型字符串,未初始化
let nsStr1:NSString
let nsStr2:NSString = "123"
// 由另一個 String 類型字符串創建
let nsStr3 = NSString(string: str4)
// 由另一個 NSString 類型字符串創建
let nsStr4 = NSString(string: nsStr2)
// 格式化創建 NSString 類型字符串
let nsStr5 = NSString(format: "age is %d, score is %d", 18, 120)
// 由 C 語言的字符串創建字符串
let nsStr6:NSString? = NSString(CString: "bei jing nin hao", encoding: NSUTF8StringEncoding)
let nsStr7:NSString? = NSString(UTF8String: "bei jing nin hao")
// 從 文件 創建,try? 異常處理,若文件不存在或讀取錯誤返回 nil
let path = NSHomeDirectory() + "/Desktop/test.txt"
let nsStr8:NSString? = try? NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
// 從 Url 創建,try? 異常處理,若文件不存在或讀取錯誤返回 nil
let url = NSURL(fileURLWithPath: NSHomeDirectory() + "/Desktop/test.txt")
let nsStr9:NSString? = try? NSString(contentsOfURL: url, encoding: NSUTF8StringEncoding)
3、字符串長度的計算
// String 型字符串
let str1:String = "zhou dong yu"
// 計算字符串中字數長度,不是字符長度,代替 count(str1)
let num1:Int = str1.characters.count
// NSString 型字符串
let str2:NSString = "hello world"
// 計算字符串中字數長度,不是字符長度
let num2:Int = str2.length
4、字符串位置的獲取
// String 型字符串
let str:String = "bei jing ni hao"
// 獲取起始位置,即 0
let startIndex = str.startIndex
// 獲取結束位置,指 字符串的結束字符 \0 的位置
let endIndex = str.endIndex
// 獲取指定位置下標值,指從 str.startIndex 開始的第 n 個位置,代替 advance(str.startIndex, 2)
let index = str.startIndex.advancedBy(2)
// 獲取下標區間值
let range = str.startIndex.advancedBy(4)...str.startIndex.advancedBy(6)
// 獲取指定位置下標的 前一個值
let predecessorIndex = str.startIndex.advancedBy(2).predecessor()
// 獲取指定位置下標的 后一個值
let successorIndex = str.startIndex.advancedBy(2).successor()
5、字符串成員的引用(取字符)
// String 型字符串
let str1:String = "bei jing ni hao"
// 取第5個字符
let substr1:String = str1.substringWithRange(str1.startIndex.advancedBy(4)...str1.startIndex.advancedBy(4))
// NSString 型字符串
let str2:NSString = "bei jing ni hao"
// 取第5個字符
let substr2:unichar = str2.characterAtIndex(4)
6、字符串的連接
// String 型字符串
let str1:String = "bei "
let str2:String = "jing "
// 使用 "+" 號連接兩個字符串
var str3:String = str1 + str2
// 在字符串的末尾拼接字符串,代替 str3.extend("123456789")
str3.write("123456789")
// 參數和返回值都為 String 型
let str4:String = str1.stringByAppendingString(str2)
// 參數和返回值都為 String 型
let str5:String = str1.stringByAppendingFormat(str2)
let str6:String = str1.stringByAppendingFormat("%@", "jing huan ying ni")
// NSString 型字符串
let str7:NSString = "bei "
let str8:NSString = "jing "
// 參數和返回值都為 String 型
let str9:String = str7.stringByAppendingString((str8 as String))
// 參數和返回值都為 NSString 型
let str10:NSString = str7.stringByAppendingFormat(str8)
let str11:NSString = str7.stringByAppendingFormat("%@", "jing huan ying ni")
// NSMutableString 型字符串
let str12:NSMutableString = "bei "
// 追加
str12.appendString("jing ")
// 格式化追加
str12.appendFormat("age is %d", 18)
7、字符串的比較
// String 型字符串
let str1:String = "bei jing"
let str2:String = "BEI JING"
// 判讀兩個字符串是否相等
let bl1:Bool = str1 == str2
// 判斷字符串是否為空
let bl2:Bool = str1.isEmpty
// 判斷字符串前綴
let bl3:Bool = str1.hasPrefix("be")
// 判斷字符串后綴
let bl4:Bool = str2.hasSuffix("ing")
// 比較兩個字符串
let result1:NSComparisonResult = str1.compare(str2)
// 忽略大小寫比較
let result2:NSComparisonResult = str1.caseInsensitiveCompare(str2)
// NSString 型字符串
let str3:NSString = "bei jing"
let str4:NSString = "BEI JING"
// 判讀兩個字符串是否相等
let bl5:Bool = str3 == str4
// 判讀兩個字符串是否相等
let bl6:Bool = str3.isEqual(str4)
// 判讀兩個字符串是否相等
let bl7:Bool = str3.isEqualToString(str4 as String)
// 判斷字符串前綴
let bl8:Bool = str3.hasPrefix("be")
// 判斷字符串后綴
let bl9:Bool = str3.hasSuffix("ing")
// 忽略大小寫比較
let result3:NSComparisonResult = str3.compare(str4 as String)
let result4:NSComparisonResult = str3.caseInsensitiveCompare(str4 as String)
8、字符串的大小寫轉換
// String 或 NSString 型字符串 返回值都為 String 型
let str1 = "bei JING"
// 將字符串轉換為大寫
let str2 = str1.uppercaseString
// 將字符串轉換為小寫
let str3 = str1.lowercaseString
// 將字符串的單詞首字母大寫
let str4 = str1.capitalizedString
9、字符串與數字的相互轉換
// String 型字符串
// 字符 轉 數字
let char:Character = "A";
var charVal1:Int = 0
// 遍歷字符轉換為的字符串
for charStr in String(char).unicodeScalars {
// 將取出的字符轉換為 Int 型數字
charVal1 = Int(charStr.value)
}
// 字符串 轉 數字
// 數字型字符串 轉 Int 型數字,代替 intStr.toInt()
let intStr:String = "64"; let intVal1:Int? = Int(intStr)
// 數字 轉 字符
let intVal2 = 65; let charVal2:Character = Character(UnicodeScalar(intVal2))
// 數字 轉 字符串
// Int 型數字 轉 字符串
let intVal3:Int = 123; let intStr1:String = intVal3.description
// Int32 型數字 轉 字符串
let int32Val1:Int32 = 32; let int32Str1:String = int32Val1.description
// Int64 型數字 轉 字符串
let int64Val1:Int64 = 64; let int64Str1:String = int64Val1.description
// Float 型數字轉 字符串
let floatVal1:Float = 2.1; let floatStr1:String = floatVal1.description
// Double 型數字轉 字符串
let doubleVal1:Double = 162.1; let doubleStr1:String = doubleVal1.description
// Bool 型 轉 字符串
let boolVal1:Bool = true; let boolStr1:String = boolVal1.description
// NSString 型字符串
// 字符串 轉 數字
// 字符串 轉 Int 型數字
let intVal4:Int = NSString(string: "6432").integerValue
// 字符串 轉 Int32 型數字
let int32Val2:Int32 = NSString(string: "32").intValue
// 字符串 轉 Int64 型數字
let int64Val2:Int64 = NSString(string: "64").longLongValue
// 字符串 轉 Float 型數字
let floatVal2:Float = NSString(string: "2.1").floatValue
// 字符串 轉 Double 型數字
let doubleVal2:Double = NSString(string: "162.1").doubleValue
// 字符串 轉 Bool 型
let boolVal2:Bool = NSString(string: "false").boolValue
10、在字符串中查找子串的位置
// NSString 型字符串
let str1:NSString = "bei jing nin hao nin hao"
let str2:String = "nin"
// 順序查找
// 從前往后查找,找到第一個即停止查找
let range1 = str1.rangeOfString(str2)
// 或者 if(range1.length == 0), location 位置,length 長度
range1.location == NSNotFound ? print("not found") : print(range1)
// 條件查找
/*
CaseInsensitiveSearch = 1, // “A”等同於“a”,不分大小寫查找
LiteralSearch = 2, // Unicode 的點對點比較。它只在所有字符都用相同的方式組成的情況下才會返回相等。
BackwardsSearch = 4, // 在字符串的末尾開始反向搜索
AnchoredSearch = 8, // 只考慮搜索的起始點(單獨使用)或終止點(當與 NSBackwardsSearch 結合使用時)。
// 這個方法可以用來檢查前綴或者后綴,以及大小寫不敏感(case-insensitive)或者
// 音調不敏感(diacritic-insensitive)的比較。
NumericSearch = 64, // 它對字符串里的數字排序
DiacriticInsensitiveSearch = 128, // “A” 等同於 “Å” 等同於 “Ä.”
WidthInsensitiveSearch = 256, // 一些東亞文字(平假名和片假名)有全寬與半寬兩種形式
ForcedOrderingSearch = 512,
RegularExpressionSearch = 1024 // 使用正則表達式搜索
*/
// 從后往前查找,找到第一個即停止查找
let range2 = str1.rangeOfString(str2, options: NSStringCompareOptions.BackwardsSearch)
range2.location == NSNotFound ? print("not found") : print(range2)
// 范圍內查找
// 在某個范圍內查找
let range3 = str1.rangeOfString(str2,
options: NSStringCompareOptions.CaseInsensitiveSearch,
range: NSMakeRange(8, 10))
range3.location == NSNotFound ? print("not found") : print(range3)
11、字符串子串的提取(取子串)
// String 型字符串
let str1:String = "今天天氣真不錯,是風和日麗的,我們下午沒有課,是心情也不錯"
// 從某個位置開始到結尾
let str2:String = str1.substringFromIndex(str1.startIndex.advancedBy(8))
// 從開始到某個位置
let str3:String = str1.substringToIndex(str1.startIndex.advancedBy(18))
// 某個范圍內
let str4:String = str1.substringWithRange(str1.startIndex.advancedBy(10)...str1.startIndex.advancedBy(15))
// NSString 型字符串
let str5:NSString = "今天天氣真不錯,是風和日麗的,我們下午沒有課,是心情也不錯"
// 從某個位置開始到結尾
let str6:String = str5.substringFromIndex(8)
// 從開始到某個位置
let str7:String = str5.substringToIndex(18)
// 某個范圍內
let str8:String = str5.substringWithRange(NSMakeRange(10, 6))
12、字符串切割
// String 型字符串
let str1:String = "chen$chao$ni$hao$ma"
let str2:String = "bei$jing#ni@hao&ma"
// 字符串 按照字符 切割
let arr1:Array = str1.componentsSeparatedByString("$")
// 字符串 按照字符集 切割
let arr2:Array = str2.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))
// NSString 型字符串
let str3:NSString = "chen$chao$ni$hao$ma"
let str4:NSString = "bei$jing#ni@hao&ma"
let str5:NSString = "Users/JHQ0228/Desktop"
// 字符串 按照字符 切割
let arr3:Array = str3.componentsSeparatedByString("$")
// 字符串 按照字符集 切割
let arr4:Array = str4.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))
// 自動按照 "/" 分割字符串
let arr5:Array = str5.pathComponents
13、字符串的插入
// String 型字符串
var str1:String = "bei jing ying ni "
// 指定位置插入字符,str1.endIndex 字符串末尾位置
str1.insert("!", atIndex: str1.endIndex)
// 指定位置插入字符串,替代 str1.splice
str1.insertContentsOf("huan ".characters, at: str1.startIndex.advancedBy(9))
// NSMutableString 型字符串
let str2:NSMutableString = "bei jing ying ni"
// 指定位置插入字符串
str2.insertString("huan ", atIndex: 9)
// 重寫全部字符串
str2.setString("nan jing huan ying ni")
14、字符串的刪除
// String 型字符串
var str1:String = "bei jing ren min huan ying nin !"
// 指定位置刪除字符 "!"
str1.removeAtIndex(str1.endIndex.predecessor())
// 指定范圍刪除字符串 "ren min "
str1.removeRange(str1.startIndex.advancedBy(9)...str1.startIndex.advancedBy(16))
// 刪除全部字符串
str1.removeAll(keepCapacity: true)
// NSMutableString 型字符串
let str2:NSMutableString = "bei jing ren min huan ying nin !"
// 刪除指定范圍的字符串
str2.deleteCharactersInRange(NSMakeRange(9, 8))
15、字符串的替換
// String 型字符串
var str1:String = "bei jing huan ying nin !"
// 用字符替換指定位置的字符串
str1.replaceRange(str1.startIndex...str1.startIndex.advancedBy(2), with: "I")
// NSMutableString 型字符串
var str2:NSMutableString = "bei jing huan ying nin !"
// 替換指定位置的字符串
str2.replaceCharactersInRange(NSMakeRange(9, str2.length - 9), withString: "ni hao")
// 查找並替換指定的字符串
str2.replaceOccurrencesOfString("in",
withString: "IN",
options: NSStringCompareOptions.LiteralSearch,
range: NSMakeRange(0, str2.length))