swift字符串和字符

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("被")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一個(gè)字符串 是一系列字符的集合,例如hello, world和albatross。Swift的字符串是String...
    BoomLee閱讀 2,525評(píng)論 0 3
  • String是例如"hello, world","albatross"這樣的有序的Character(字符)類型的...
    窮人家的孩紙閱讀 907評(píng)論 2 1
  • 今天真的是,無(wú)fuck說(shuō)。 一大早我還沒起床就開始停電,我以為只是停一小會(huì)兒,沒想到啊沒想到,居然停到了晚上八點(diǎn)多...
    渣橙閱讀 199評(píng)論 0 0
  • 有時(shí)候等待也是值得的 風(fēng)景秀麗要慢慢賞 人生精彩要慢慢等 你會(huì)遇見誰(shuí) 都是命運(yùn)的安排 和酒夢(mèng)小姑娘相識(shí)緣于文字,看...
    美麗心情0206閱讀 613評(píng)論 6 3
  • 枯草在風(fēng)中微微蕩漾 是誰(shuí)傳來(lái) 那遠(yuǎn)方的呼喚 多想用一腔熱血 溫暖這一季的荒涼 哀傷里的憂愁 難以假裝視而不見 此時(shí)...
    小胡巴閱讀 362評(píng)論 17 40

友情鏈接更多精彩內(nèi)容