介紹
在 Swift 中絕大多數(shù)情況下都推薦使用 String 類型,在 Swift3.0 更是取消了 NSString 在 Swift 文件中的代碼提示。
特點
-
String是一個結(jié)構(gòu)體,性能比NSString更高; -
String擁有絕大部分NSString的功能; -
String可以直接進(jìn)行遍歷,NSString不支持直接遍歷。
字符串的遍歷
override func viewDidLoad() {
super.viewDidLoad()
demo()
}
func demo() {
let str = "這是一段測試字符"
for c in str.characters {
print(c)
}
}
輸出結(jié)果:

字符串遍歷展示
獲取字符串的長度
- 獲取字符串的字節(jié)長度
用習(xí)慣了override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "這是一段測試字符" print(str.lengthOfBytes(using: .utf8)) }Objective-C里的length方法初轉(zhuǎn)到Swift會很不習(xí)慣。以上代碼的意思是通過lengthOfBytes()函數(shù)獲取字符串在內(nèi)存中的字節(jié)數(shù),.utf8是指定字符串的編碼格式。以下為輸出結(jié)果:
獲取字節(jié)長度代碼輸出
utf8編碼格式下每個漢字占用三個字節(jié),所以會輸出為24。 - 獲取字符串字符數(shù)的兩種方式
1.Swift獲取字符串字符數(shù)(推薦使用);override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "這是一段測試字符" print(str.characters.count) }- 使用
NSString中轉(zhuǎn)獲取字符串的字符數(shù)。
上面代碼中的override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "這是一段測試字符" let ocStr = str as NSString print(ocStr.length) }as表示將前面str做為NSString,類似于Objective-C中的類型強轉(zhuǎn)(NSString *)str,以下為代碼輸出結(jié)果:
獲取字符串字符數(shù)輸出結(jié)果 - 使用
字符串的拼接
- 代碼示例
以上代碼是在override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let name = "張三" let age = 25 let title : String? = "總裁" print("姓名:\(name)\n年齡:\(age)\n職位:\(title ?? "")") }Swift中常規(guī)的字符串拼接方式,格式為:"\(var或者let)再也不需要考慮類似于stringWithFormat這樣的語句了。值得注意的是可選項拼接的時候需要解包。
代碼的輸出結(jié)果:
字符串拼接輸出結(jié)果
限定格式的字符串拼接
- 代碼示例
以上代碼將數(shù)值以時間格式輸出,類似于override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let h = 5 let m = 7 let s = 6 print(String(format:"%02d:%02d:%02d", h, m, s)) }Objective-C中的格式化字符串語句[NSString stringWithFormat:]
代碼輸出結(jié)果:
時間格式代碼輸出
字符串的子串(截?。?/h4>
在2.0和3.0時代,Swift有自己截取子字符串的方法,但一直在優(yōu)化,在4.0更新了以后更是放棄了 Swift 相對繁瑣的截取方法,所以在 Swift4.0 時代我們只有通過將 String 字符串轉(zhuǎn)成 NSString 來進(jìn)行操作
- 代碼示例:
上面代碼表示定義了一個常量字符串override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "abcdefg" let ocStr = str as NSString let s1 = ocStr.subString(with: NSMakeRange(2, 3)) print(s1) }“abcdefg”并將這個字符串強轉(zhuǎn)為NSString,接下來的操作就和我們用Objective-C的操作一樣了,NSMakeRange(2, 3)表示從第二個字符開始截取三個長度的子字符串。
輸出結(jié)果:
字符串截取結(jié)果輸出
Swift3.0的截取方法(已過期但仍可以使用),具體實現(xiàn)方法就不一一做介紹了,有時間會寫一篇關(guān)于Swift字符串操作的專題。
代碼棄用提醒展示
總結(jié)
-
Swift中的字符串String是一個結(jié)構(gòu)體; -
String比NSString更加強大,支持直接遍歷; -
String比NSString性能更高; -
String不能直接使用length獲取字符長度,通過lengthOfBytes()獲取到的長度是字符串的所占字節(jié)數(shù),如果要用Objective-C的方法操作String需要類型強轉(zhuǎn),寫法為String as NSString; -
String的拼接比NSString更加簡便好用,如果拼接復(fù)雜型字符串也有相應(yīng)的函數(shù); -
String的截取推薦轉(zhuǎn)換為NSString來操作,因為Swift4.0取消了字符串截取方法,使用NSString更容易理解。





