swift 字符串操作

特性:

?1. Unicode 編碼規(guī)范: 可以使用任何字符仑撞,表情

?2. 與本地語(yǔ)言無關(guān):無需去考慮漢子及其他字體亂碼以及轉(zhuǎn)碼問題

?3. 高效

?4. 值類型:無論作為參數(shù)傳遞還是復(fù)制給別的常量或變量都會(huì)copy一份(是否真正copy一份在內(nèi)存中取決于編譯器的優(yōu)化決定)

?5. 與 NSString 兼容

?String 的初始化方式

?使用字符串常量值初始化

var str = ""

var str1 = "Hello, playground"

? 使用 init 方法初始化??

1. 字符串常量值初始化

? ?// str3, str4 效果與str, str1 效果相同队伟,

?let str3 = String()

let str4 = String("Hello, playground")?

? 2. charater及數(shù)組初始化

? let ch:Character = "A"

let str5 = String(ch)let catCharacters: [Character] = ["C", "a", "t", "!", "??"]

let catString = String(catCharacters)

? 3. CharacterView 作為參數(shù)初始化

? ? String 的 CharacterView 屬性是一個(gè)擴(kuò)張字符簇的集合,它近似于人的可讀字符幽勒。一些獨(dú)立的字符嗜侮,? ? ? ? 如é”, “?”, and “???? 是由多個(gè)unicode 代碼點(diǎn)組成,é(e\u{301}), 這些代碼點(diǎn)通過Unicode的邊界算法組? ? ? ? 合成擴(kuò)張字符簇中的字符啥容,這個(gè)字符就是swift 中的Charater類型锈颗,CharacterView 中的每一個(gè)元素就? ? ? ? 是一個(gè)Charater, 我們可以把CharacterView 看做是Charater的一個(gè)集合

? let poem = "'Twas brillig, and the slithy toves / " +? ? "Did gyre and gimbal in the wabe: / " +? ? ? ? "All mimsy were the borogoves / " +? ? ? ? "And the mome raths outgrabe."

? let result = poem.characters?

? ? ? print(result)?

? 輸出結(jié)果 :CharacterView(_core: Swift._StringCore(_baseAddress: Optional(0x0000600000177de0), _countAndFlags: 132, _owner: Optional(Swift._HeapBufferStorage)))

我們可以把這個(gè)結(jié)果轉(zhuǎn)成數(shù)組? print(Array (result))

let excerpt = String(poem.characters.prefix(22)) + "..." // charaterView 初始化

print(excerpt)

CharacterView 只是swift中的一種編碼形式,還有其他三種

?Unicode Scalar View

String 的 unicodeScalars 屬性是unicode 標(biāo)量的集合咪惠,基本的unicode占21個(gè)比特位击吱。每一個(gè)unicodeScalar表示的標(biāo)量等同于UTF-32。

?UTF-16 View:

String 的 utf16 屬性是一個(gè)utf-16的編碼集遥昧,每一個(gè)編碼單元都是一個(gè)utf-16實(shí)例覆醇,占據(jù)16bit。在OC中炭臭,NSString的編碼方式就是utf16

?UTF-8 View

String 的 utf8 屬性是一個(gè)utf-8的編碼集永脓,每一個(gè)編碼單元都是一個(gè)utf-8實(shí)例 占據(jù)8bit。當(dāng)把String實(shí)例傳給c APIs時(shí)使用的就是這種編碼形式鞋仍。

不同的字符編碼形式所占的空間不同所以每一個(gè)編碼單元所能表示的范圍也不同常摧,同一個(gè)字符串在不同的編碼形式下會(huì)有不同的存儲(chǔ)形式,會(huì)有不同的長(zhǎng)度凿试。


let cafe = "Cafe\u{301} du ??"

print(Array(cafe.characters))

print(cafe.unicodeScalars.map { $0.value })

print(Array(cafe.utf16))

print(Array(cafe.utf8))


結(jié)果:`

["C", "a", "f", "e?", " ", "d", "u", " ", "??"]

[67, 97, 102, 101, 769, 32, 100, 117, 32, 127757]

[67, 97, 102, 101, 769, 32, 100, 117, 32, 55356, 57101]

[67, 97, 102, 101, 204, 129, 32, 100, 117, 32, 240, 159, 140, 141]

?從文件中初始化


do {

let abc = try String(contentsOfFile:"123", encoding:String.Encoding.utf8)

print(abc)

} catch? {

}


?長(zhǎng)度計(jì)算

通過 character.count 計(jì)算字符串的長(zhǎng)度排宰,由于字符串采用的是擴(kuò)張的字符集, 所以在一些情況下即使發(fā)生了修改其長(zhǎng)度也可能不會(huì)這化


var word = "cafe"

print("the number of characters in \(word) is \(word.characters.count)")

// Prints "the number of characters in cafe is 4"

word += "\u{301}"? ? // COMBINING ACUTE ACCENT, U+0301

print("the number of characters in \(word) is \(word.characters.count)")

// Prints "the number of characters in cafe? is 4”


訪問和修改字符串

就像我們上面提到的那婉,String在不同的編碼下所占的內(nèi)存空間是完全不同的板甘,所以我們無法通過一個(gè)整型的下標(biāo)值來定位一個(gè)字符的位置,如果想要通過下標(biāo)來訪問這樣的方式來訪問详炬,我們就要用到String.Index盐类。

startIndex: 第一個(gè)字符所在的位置

endIndex:? 最后一個(gè)字符的下一位所在的位置


var str = "Cafe\u{301} du ??"

print(str.characters.count)

print(str[str.startIndex])

print(str[str.index(after: str.startIndex)])

let index = str.index(before: str.endIndex)

print(str[index])


如果想改變?cè)址褂胊ppend

var a = "Hello"

a.append("abc")

print(a) // Helloabc

a 必須是變量


通過after 和before可以找到當(dāng)前Index的上個(gè)位置或下一個(gè)位置.

let index = str.index(str.startIndex, offsetBy: 5)

print(str[index])

如果采用上面的方法,當(dāng)結(jié)果超出endIndex 時(shí)就會(huì)報(bào)錯(cuò)呛谜,我們可以采用下面的方法來防止這樣的錯(cuò)誤發(fā)生在跳,如果超出時(shí)就返回nil

let indexN = str.index(str.startIndex, offsetBy: 20, limitedBy: str.endIndex)

查找字符串的位置:

let index = str.characters.index(of: "a");

//查找第一個(gè)大寫字母

let greeting = "hello, friEnd!"

if let i = greeting.characters.index(where: { $0 >= "A" && $0 <= "a" }) {

print("First capital letter: \(greeting[i])")

}

連接,格式化

連接兩個(gè)字符串隐岛,并生成一個(gè)新的字符串

let a = "Hello"

let b = "World"

let c = a + b

print(a)? //? Hello

print(b)? // World

print(c) // HelloWorld

let? count = 10;

let result = "The result is \(count)"

print(result)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猫妙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子聚凹,更是在濱河造成了極大的恐慌割坠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妒牙,死亡現(xiàn)場(chǎng)離奇詭異彼哼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)湘今,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門敢朱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摩瞎,你說我怎么就攤上這事拴签。” “怎么了旗们?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵篓吁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蚪拦,道長(zhǎng)杖剪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任驰贷,我火速辦了婚禮盛嘿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘括袒。我一直安慰自己次兆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布锹锰。 她就那樣靜靜地躺著芥炭,像睡著了一般漓库。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上园蝠,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天渺蒿,我揣著相機(jī)與錄音,去河邊找鬼彪薛。 笑死茂装,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的善延。 我是一名探鬼主播少态,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼易遣!你這毒婦竟也來了彼妻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤豆茫,失蹤者是張志新(化名)和其女友劉穎澳骤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澜薄,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡为肮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肤京。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颊艳。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忘分,靈堂內(nèi)的尸體忽然破棺而出棋枕,到底是詐尸還是另有隱情,我是刑警寧澤妒峦,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布重斑,位于F島的核電站,受9級(jí)特大地震影響肯骇,放射性物質(zhì)發(fā)生泄漏窥浪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一笛丙、第九天 我趴在偏房一處隱蔽的房頂上張望漾脂。 院中可真熱鬧,春花似錦胚鸯、人聲如沸骨稿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坦冠。三九已至形耗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辙浑,已是汗流浹背激涤。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留例衍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓已卸,卻偏偏與公主長(zhǎng)得像佛玄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子累澡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 .字符串字面量 String 在Swift中字符串字面量是由雙引號(hào)" " 包裹著的 像我們?cè)?Swift 3 ...
    iceMaple閱讀 1,128評(píng)論 1 2
  • 53.計(jì)算字符 在字符串中獲取字符值的數(shù)量, 可以使用字符串字符屬性中的計(jì)數(shù)屬性: let unusualMena...
    無灃閱讀 1,091評(píng)論 0 4
  • /* split(" ")按照" "分割字符串梦抢,對(duì)每個(gè)分割出來的字符創(chuàng)建為String lazy是延遲調(diào)用 map...
    逗留閱讀 254評(píng)論 0 0
  • 大家都知道畫家梵高吧,這人一輩子作品無數(shù)愧哟,生前卻只賣出去一幅畫奥吩,貧困潦倒最后自殺,同樣是畫家蕊梧,畢加索的畫就很暢銷霞赫,...
    青衣刀客閱讀 301評(píng)論 0 0
  • 人生也像開往遠(yuǎn)方的列車,過去的風(fēng)景雖美肥矢,可再也回不去了端衰。有些人,有些事甘改,即使曾經(jīng)那么得記憶猶新旅东,終抵不過流年似水,...
    呼延馨閱讀 264評(píng)論 0 1