String類型是一種快速、現(xiàn)代化的字符串實(shí)現(xiàn),每一個(gè)字符串都是由編碼無(wú)關(guān)的Unicode字符組成,并支持訪問字符的多種Unicode表示形式,如:UTF8、UTF16等。字符串的內(nèi)容都是由一個(gè)個(gè)的Character組成。
在開發(fā)中,對(duì)字符串、字符常用的操作有:
初始化空字符串
使用可變、不可變字符串
字符串是值類型
與NSString互轉(zhuǎn)
計(jì)算字符數(shù)量
比較字符串
連接字符串和字符
獲取、刪除、添加、修改字符/字符串
分割字符串
注意:
Swift的String類型與Foundation NSString類進(jìn)行了無(wú)縫橋接,因此這兩者可以直接互轉(zhuǎn),然后可調(diào)用對(duì)應(yīng)的類型的所有API。
初始化空串
初始化空字符串有三種方式,分別為:
直接使用雙引號(hào)
使用String結(jié)構(gòu)體的無(wú)參構(gòu)造函數(shù)
使用String結(jié)構(gòu)體的有參構(gòu)造函數(shù),但參數(shù)傳雙引號(hào)
var string = "" // 空字符串
string = String() // 空字符串
string = String("")// 空字符串
字符Character最常用的構(gòu)造函數(shù):
/// 根據(jù)一個(gè)只有一個(gè)字符的字符串創(chuàng)建一個(gè)`Character`
///
/// 要求參數(shù)s字符串中只能包含一個(gè)字符
public init(_ s: String)
對(duì)于初始化字符常用的方式
// 對(duì)于構(gòu)造函數(shù):public init(_ s: String)
// 我們必須保證所傳的參數(shù)`s`字符串中最多包含一個(gè)字符,否則會(huì)`Crash`掉
var c = Character("1")// OK
var cc = Character("10") // Factal error
// 上面使用構(gòu)造的方法與下面這種直接賦值的方式是一樣的,實(shí)際上也是通過轉(zhuǎn)換成構(gòu)造函數(shù)`public init(_ s: String)`來(lái)初始化
var c: Character = "A"
與NSString互轉(zhuǎn)
Swift中的String與Foundation中的NSString進(jìn)行了無(wú)縫橋接,因此我們?cè)谑褂弥锌梢灾苯幼屵@兩種類型直接互轉(zhuǎn),不會(huì)出現(xiàn)失敗。
var ss = "String中并不包含所有的NSString的方法"
var nss = ss as NSString // OK
var str = nss as String // OK
但是,我們不能直接將String轉(zhuǎn)換成NSMutableString。由于String與NSString是無(wú)縫橋接的,因此轉(zhuǎn)換必定成功,直接使用as轉(zhuǎn)換即可。
提示:類型轉(zhuǎn)換使用關(guān)鍵字as,如果轉(zhuǎn)換有可能失敗,則需要使用as?。如果認(rèn)為一定不會(huì)失敗,我們可以使用強(qiáng)制轉(zhuǎn)換as!,但是一旦失敗就會(huì)崩潰。
計(jì)算字符數(shù)量
計(jì)算字符串的字符的個(gè)數(shù)與NSString的不一樣,沒有l(wèi)ength方法。在String中,對(duì)字符的操作,主要是通過其屬性characters來(lái)操作。
let str = "計(jì)算字符串de個(gè)數(shù)"
print(str.characters.count) // 9
當(dāng)前我們也可以通過直接轉(zhuǎn)換成NSString再獲取其長(zhǎng)度:
let name = str as NSString
print(name.length) // 9
比較字符串
對(duì)于字符串String的比較,與NSString相比,簡(jiǎn)單了很多,因此Swift支持重載函數(shù)和符號(hào)函數(shù),因此,就可以直接定義==、!=函數(shù)。判斷是否相等,使用兩個(gè)等號(hào)==,不相等就用!=就可以了。
if str != "謝謝" {
print("不相等")
}
if "謝謝" == "謝謝" {
print("肯定相等")
}
通常我們還會(huì)對(duì)字符串的前綴、后綴比較:
if str.hasPrefix("字符串") {
print("有...")
}
if str.hasSuffix("連接") {
print("有...")
}
還可以直接判斷是否包含某個(gè)子串:
print(str.containsString("符"))// true
判斷是否為空串,可以使用==判斷,也可以直接獲取其屬性isEmpty,注意它不是一個(gè)函數(shù):
print(str.isEmpty)// false
print(str == "") // false
雖然兩者都有兩樣的效果,但是推薦使用isEmpty,可讀性更強(qiáng)一些。
連接字符串和字符
在Swift中,對(duì)String字符串類型操作,比NSString要簡(jiǎn)單多了,拼接字符串,可直接使用+=符號(hào)函數(shù),也可以使用(變量名)這種方式插入,還可以使用append方法添加字符。
var str = "字符串連接"
// str=字符串連接值拷貝,string=值拷貝
str += string
// 使用\(變量、常量、函數(shù)返回值等)
str = "\(str)\(string)"
// 注意,由于"A"這么寫編譯器無(wú)法識(shí)別是字符還是字符串,
// 且append只能追加一個(gè)字符,不能追加字符串
//str.append("A")// 提示:mutating func append(c: Character)
str.append(Character("A"))// 傳類型強(qiáng)轉(zhuǎn)換就可以了
// 如果是追加字符串,可以使用`write`方法
str.write("頂起")
print(str)
獲取、刪除、添加、修改字符/字符串
對(duì)于刪除、添加、修改字符串,只是對(duì)可變字符串有效。
添加字符串的與上面的連接字符串和字符是一樣的。關(guān)于write方法和append方法有多個(gè)函數(shù),自己再深入學(xué)習(xí)。當(dāng)然還有insert方法、appendContentsOf等
刪除字符:
清空字符串可以使用removeAll等方法,也可以直接使用雙引號(hào):
// 傳true參數(shù),表示內(nèi)容清除,但容量不變
str.removeAll(keepCapacity: true)
// 使用默認(rèn)值,容量會(huì)清掉
str.removeAll()
// 也可以使用這樣:
str = ""
// 還可以直接使用刪除范圍函數(shù):
str.removeRange(Range(start: str.startIndex, end: str.endIndex))
刪除部分字符:
// 刪除第一個(gè)字符
str.removeAtIndex(str.startIndex)
// 刪除第一個(gè)字符
str.characters.removeFirst()
// 刪除最后一個(gè)字符
str.characters.removeLast()
// 刪除某個(gè)函數(shù)
str.removeRange(Range(start: str.startIndex, end: str.endIndex))
修改字符串:
我們主要是使用replaceRange方法:
let range = str.rangeOfString("頂起")
str.replaceRange(range!, with: "被替換的值")
print(str)
獲取字符串、字符
通過循環(huán)的方式來(lái)遍歷:
for c in str.characters {
print(c)
}
如果在遍歷中需要知道其索引和值,可以通過快速枚舉:
for (index, c) in str.characters.enumerate() {
print("c = \(c), index= \(index)")
}
下面這種方式是非常少用的,因?yàn)榉浅2缓糜茫?/p>
for var index = 0; index < str.characters.count; ++index {
// 不能直接使用str[index]獲取,也沒有str.characters[index]
}
分割字符串
最常用的方法就是componentsSeparatedByString,會(huì)返回一個(gè)數(shù)組:
str.componentsSeparatedByString("被")