字符串和字符

????一個(gè)字符串就是一組字符,比如"hello, world"或者"albatross"孩等。Swift中的字符串有String類型體現(xiàn)出來,一個(gè)字符串可以通過多種不同的方式來獲取不同的內(nèi)容采够,包括以一個(gè)字符的集合的方式肄方。

? ? Swift中的String和Character類型可以快速的處理代碼中的文本,且兼容Unicode,創(chuàng)建和操作字符串的語法很輕量和易讀蹬癌,string的字面量和C語言很像。字符串的連接很簡單隅要,使用加法運(yùn)算符(+)連接字符串就可以董济。字符串是否可變?nèi)Q于它是一個(gè)常量還是一個(gè)變量。你可以把常量,變量,字面量或者表達(dá)式插入到一個(gè)長字符串中欢搜,這個(gè)過程叫做字符串插入谴轮。這也就使字符串的展示,存儲(chǔ)和打印更加簡單书聚。

? ? 盡管Swift中的String的語法很簡單雌续,但是它有快速和現(xiàn)代的實(shí)現(xiàn)胯杭。每一個(gè)字符串都是有一組無關(guān)編碼的Unicode字符組成搏屑,并且可以訪問這個(gè)字符在不同Unicode形式下的值侣背。

NOTE:Swift的字符串和Foundation庫中的NSString可以橋接曲梗。Fondation庫同時(shí)擴(kuò)展了String,以暴露出NSString的方法菱蔬。所以Stirng類型的變量不需要轉(zhuǎn)換就可以訪問NSString的方法糯景。

字符串字面量

? ? 你可以在代碼中包含預(yù)定義的String的值,也就是字面量省骂。一個(gè)字符串的字面量是一組有雙括號(hào)包圍的字符。

? ? 可以使用字符串字面量初始化一個(gè)常量或者變量:

? ??????let someString = "Some string literal value

? ? 這里常量someString被推斷是String類型怠惶,因?yàn)樗褂昧俗址置媪砍跏蓟?b>

多行字符串字面量

需要你需要一個(gè)字符串跨越很多行轧粟,使用多行字符串字面量,一組由三個(gè)雙引號(hào)包圍的字符:

? ??????let quotation = """

????????The White Rabbit put on his spectacles.? "Where shall I begin,

????????please your Majesty?" he asked.

????????"Begin at the beginning," the King said gravely, "and go on

????????till you come to the end; then stop."

????????""

????一個(gè)多行字符串字面量包含了三括號(hào)包含了的所有的行逃延。這個(gè)字符串從第一行的三個(gè)雙括號(hào)開始揽祥,在最后一行的三個(gè)雙括號(hào)結(jié)束。這就意味著,下面的2個(gè)字符串都既不是由換行符開始也不是由換行符結(jié)束:

? ??????let singleLineString = "These are the same."

????????let multilineString = """

????????These are the same.

????????""

? ? 在你的代碼中拄丰,一個(gè)多行字符串字面量包含了換行符俐末,那么字符串的值中也就有了換行符卓箫。如果你添加換行符只是為了增加可讀性垄潮,而不需要換行符在值中存在,那么在這一寫行末尾添加反斜杠\

? ??????let softWrappedQuotation = """

????????The White Rabbit put on his spectacles.? "Where shall I begin, \

????????please your Majesty?" he asked.

????????"Begin at the beginning," the King said gravely, "and go on \

????????till you come to the end; then stop."

????????""

? ? 如果要?jiǎng)?chuàng)建一個(gè)以換行符開頭或者結(jié)尾的多行字符串字面量旅急,在第一行或者最后一行寫一個(gè)空白行牡整。比如:

? ??????let lineBreaks = """

? ??????????????

????????This string starts with a line break.

????????It also ends with a line break.


????????""

? ? 多行字符串可以通過縮進(jìn)匹配代碼,終止符三個(gè)雙引號(hào)之前的空格符逃贝,會(huì)告訴Swift其它行前面需要忽略的空格符的數(shù)量。當(dāng)然在終止符三個(gè)雙引號(hào)前泥从,你在一行的開頭添加了空格符沪摄,那么這些空格符是不會(huì)被忽略的。

? ? 上面的例子中和敬,即使整個(gè)多行字符串都是被鎖進(jìn)的戏阅,但是第一行和最后一行都不是以空格為首的,中間的一行比終止引號(hào)那一行有更多的縮進(jìn)舱痘,因此它是以4個(gè)額外的空格符為首的离赫。

字符串字面量中的特殊字符

????字符串字面量可以包含以下特殊字符:

? ? 特殊的轉(zhuǎn)移字符: \0(空字符) ,\\ (反斜杠)旬盯,\t(tab),\n(換行符)胖翰,\r(會(huì)車符), \"(雙引號(hào)), \'(單引號(hào))

? ? Unicode標(biāo)量:寫成\u{n},其中n是一個(gè)1-8位的16進(jìn)制的數(shù)字懊缺,這個(gè)數(shù)字等于一個(gè)Unicode代碼單元培他。

? ? 下面的4個(gè)例子展示了這種特殊的字符。常量wiseWords包含了2個(gè)轉(zhuǎn)義后的雙引號(hào)怔毛,常量dollarSign腾降,blackHeart和sparklingHeart展示了Unicode標(biāo)量的格式:

? ??????let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"

????????// "Imagination is more important than knowledge" - Einstein

????????let dollarSign = "\u{24}"? ? ? ? // $,? Unicode scalar U+0024

????????let blackHeart = "\u{2665}"? ? ? // ?,? Unicode scalar U+2665

????????let sparklingHeart = "\u{1F496}" // ??, Unicode scalar U+1F496

? ? 在多行字符串字面量中碎绎,使用了3個(gè)雙括號(hào)而不是一個(gè)雙括號(hào),所以不需要轉(zhuǎn)義也可以包含雙引號(hào)奸晴。如果要在多行字符串字面量包含三個(gè)雙引號(hào)日麸,那么請至少轉(zhuǎn)義其中的一個(gè)引號(hào),例如:

? ??????let threeDoubleQuotes = """

????????Escaping the first quote \"""

????????Escaping all three quotes \"\"\"

????????""

初始化空字符串

? ? 有時(shí)為了包含一個(gè)長字符串,我們需要先創(chuàng)建一個(gè)空字符串墩划,這個(gè)時(shí)候我們可以把空的字符串字面量賦值給變量嗡综,或者使用初始化的語法初始化一個(gè)新的字符串實(shí)例:

? ??????var emptyString = "" // empty string literal

????????var anotherEmptyString = String()? // initializer syntax

????????// 2個(gè)字符串都是空字符串,彼此相等

? ? 通過檢查他的isEmpty屬性可以知道String值是不是一個(gè)空字符串:

? ??????if emptyString.isEmpty {

????????? ? print("Nothing to see here")

????????}

????????// 打印 "Nothing to see here”

可變字符串

? ? 一個(gè)字符串值賦值給一個(gè)變量,這個(gè)字符串就可以變修改,賦值給常量,這個(gè)字符串就不允許被修改:

? ??????var variableString = "Horse"

????????variableString += " and carriage"

????????// variableString is now "Horse and carriage"

????????let constantString = "Highlander"

????????constantString += " and another Highlander"

????????// 編譯時(shí)錯(cuò)誤 -"a constant string cannot be modified"

NOTE:這個(gè)中方式和OC中選擇不同的實(shí)現(xiàn)類來表明是否可變不一樣

字符串是一個(gè)值類型

? ? Swift中的值變量是一個(gè)值類型察净。如果你創(chuàng)建了一個(gè)新的String值盼樟,當(dāng)你把它傳給一個(gè)函數(shù)或者方法的時(shí)候,他的值將會(huì)被拷貝。所有情況下译秦,根據(jù)一個(gè)已經(jīng)存在的String創(chuàng)建了一個(gè)新的copy,這個(gè)新的拷貝被傳遞且擁有自己的內(nèi)存空間,和模版不再是同一個(gè)變量棋返。

? ? Swift中String默認(rèn)拷貝的行為雷猪,讓你在一個(gè)函數(shù)或者方法中的得到一個(gè)String類型的入?yún)r(shí),可以確定你擁有一個(gè)明確的String的值求摇,不需要關(guān)心它的來出。你可以肯定,這個(gè)字符串不會(huì)被其他地方改變,除非你自己去改變它验夯。

? ? 在背后摔刁,Swift的編譯器會(huì)優(yōu)化Strng的使用,因此绑谣,真正的拷貝行為只有在確實(shí)需要的時(shí)候才會(huì)發(fā)生拗引。這讓你在使用String的時(shí)候總是可以獲得很不錯(cuò)的性能。 ? ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壤玫,一起剝皮案震驚了整個(gè)濱河市哼凯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌断部,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘱能,死亡現(xiàn)場離奇詭異惹骂,居然都是意外死亡做瞪,警方通過查閱死者的電腦和手機(jī)右冻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門著拭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乳蛾,你說我怎么就攤上這事鄙币。” “怎么了十嘿?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵绩衷,是天一觀的道長。 經(jīng)常有香客問我勿决,道長迟郎,這世上最難降的妖魔是什么聪蘸? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮控乾,結(jié)果婚禮上娜遵,老公的妹妹穿的比我還像新娘。我一直安慰自己设拟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布镰吆。 她就那樣靜靜地躺著万皿,像睡著了一般摧找。 火紅的嫁衣襯著肌膚如雪牢硅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天综苔,我揣著相機(jī)與錄音佳励,去河邊找鬼赃承。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞧剖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播做粤,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼捉撮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肉康?” 一聲冷哼從身側(cè)響起灼舍,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炫乓,沒想到半個(gè)月后献丑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔粒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年筐摘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了船老。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圃酵。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郭赐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捌锭,到底是詐尸還是另有隱情,我是刑警寧澤拉盾,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布豁状,位于F島的核電站,受9級(jí)特大地震影響夭禽,放射性物質(zhì)發(fā)生泄漏谊路。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一潮梯、第九天 我趴在偏房一處隱蔽的房頂上張望剩彬。 院中可真熱鬧矿卑,春花似錦、人聲如沸母廷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽业舍。三九已至升酣,卻和暖如春态罪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绩聘。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工耗啦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衅谷。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓舒帮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玩郊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 字符串和字符 [TOC] 字符串是例如 "hello, world" , "albatross" 這樣的有序的 C...
    伍哥___閱讀 1,083評(píng)論 0 0
  • 字符串 String 多行字符串字面量 """ 在行尾寫一個(gè)反斜杠(\)作為續(xù)行符耻陕。 為了讓一個(gè)多行字符串字面量...
    答案MK閱讀 1,498評(píng)論 0 0
  • 隨著現(xiàn)在社會(huì)的發(fā)展刨沦,差不多每一個(gè)家庭都有車了吧。我們的汽車是我們的交通工具召庞,我們每一年都會(huì)去保養(yǎng)来破,甚至是一年保養(yǎng)2...
    魅力人生008閱讀 507評(píng)論 0 0
  • 不諳世事的心,奔赴萬里的魂炮沐,七零八亂的魄,還有那殘缺不全祭阀,體無完膚的皮囊鲜戒。 等著一架任人操縱的傀儡专控,擺脫僅有微米的...
    千年難嘆浮云斷閱讀 569評(píng)論 0 0
  • 第四章《課程發(fā)展的回歸現(xiàn)象與非線性模式——檢視課程思潮的一種視角》 變化多端的課程思潮 ...
    段麗英貴州閱讀 254評(píng)論 0 0