介紹
在 Swift
中絕大多數(shù)情況下都推薦使用 String
類型,在 Swift3.0
更是取消了 NSString
在 Swift
文件中的代碼提示。
特點(diǎn)
-
String
是一個(gè)結(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
會(huì)很不習(xí)慣。以上代碼的意思是通過lengthOfBytes()
函數(shù)獲取字符串在內(nèi)存中的字節(jié)數(shù),.utf8
是指定字符串的編碼格式。以下為輸出結(jié)果:
獲取字節(jié)長度代碼輸出
utf8
編碼格式下每個(gè)漢字占用三個(gè)字節(jié),所以會(huì)輸出為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
中的類型強(qiáng)轉(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
這樣的語句了。值得注意的是可選項(xiàng)拼接的時(shí)候需要解包。
代碼的輸出結(jié)果:
字符串拼接輸出結(jié)果
限定格式的字符串拼接
- 代碼示例
以上代碼將數(shù)值以時(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é)果:
時(shí)間格式代碼輸出
字符串的子串(截取)
在2.0和3.0時(shí)代,Swift
有自己截取子字符串的方法,但一直在優(yōu)化,在4.0更新了以后更是放棄了 Swift
相對(duì)繁瑣的截取方法,所以在 Swift4.0
時(shí)代我們只有通過將 String
字符串轉(zhuǎn)成 NSString
來進(jìn)行操作
- 代碼示例:
上面代碼表示定義了一個(gè)常量字符串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”
并將這個(gè)字符串強(qiáng)轉(zhuǎn)為NSString
,接下來的操作就和我們用Objective-C
的操作一樣了,NSMakeRange(2, 3)
表示從第二個(gè)字符開始截取三個(gè)長度的子字符串。
輸出結(jié)果:
字符串截取結(jié)果輸出
Swift3.0
的截取方法(已過期但仍可以使用),具體實(shí)現(xiàn)方法就不一一做介紹了,有時(shí)間會(huì)寫一篇關(guān)于Swift
字符串操作的專題。
代碼棄用提醒展示
總結(jié)
-
Swift
中的字符串String
是一個(gè)結(jié)構(gòu)體; -
String
比NSString
更加強(qiáng)大,支持直接遍歷; -
String
比NSString
性能更高; -
String
不能直接使用length
獲取字符長度,通過lengthOfBytes()
獲取到的長度是字符串的所占字節(jié)數(shù),如果要用Objective-C
的方法操作String
需要類型強(qiáng)轉(zhuǎn),寫法為String as NSString
; -
String
的拼接比NSString
更加簡便好用,如果拼接復(fù)雜型字符串也有相應(yīng)的函數(shù); -
String
的截取推薦轉(zhuǎn)換為NSString
來操作,因?yàn)?Swift4.0
取消了字符串截取方法,使用NSString
更容易理解。