Swift 字符串速查表

鏈接:http://www.cocoachina.com/swift/20151218/14746.html

字符串初始化

創(chuàng)建一個(gè)字符串對(duì)象有無數(shù)種方式可以使用,包括字面量、從其他 Swift 類型轉(zhuǎn)換、Unicode等等。

var emptyString = ""  *// 空字符串*
var stillEmpty = **String**() *// 另一種空字符串的形式*
let helloWorld = "Hello World!" *// 字符串字面量*
let a = **String**(true) *// 由布爾值轉(zhuǎn)換為:"true"*
let b: Character = "A" *// 顯式創(chuàng)建一個(gè)字符類型*
let c = **String**(b) *// 從字符 "A" 轉(zhuǎn)換*
let d = **String**(3.14) *// 從 Double 類型轉(zhuǎn)換為 "3.14"*
let e = **String**(1000) *// 從 Int 類型轉(zhuǎn)換為 "1000"*
let f = "Result = \(d)" *// 字符串插值 "Result = 3.14"*
let g = "\u{2126}" *// Unicode 字符,歐米伽符號(hào) Ω*
let h = **String**(count:3, repeatedValue:b) *// 重復(fù)字符組成的字符串 "AAA"*

字符串是值類型

字符串是值類型(Value Type),當(dāng)用其賦值或者函數(shù)傳參的時(shí)候它會(huì)被拷貝(copied)怔鳖。所拷貝的值在修改的時(shí)候是懶加載的(lazy)。

var aString = "Hello"
var bString = aString
bString += " World!"    *// "Hello World!"*
print("(aString)")     *// "Hellon"*

字符串檢測(cè)(空值固蛾、等值以及次序)

檢測(cè)一個(gè)字符串是否為空:

emptyString.isEmpty        // true

Swift 是支持 Unicode 編碼的结执,因此相等運(yùn)算符(”==”)將會(huì)判斷 Unicode 的范式是否等價(jià)(canonical equivalence)。這意味著對(duì)于兩個(gè)字符串來說艾凯,如果擁有相同的語(yǔ)義(linguistic meaning)和表現(xiàn)形式的話昌犹,即使它們由不同 Unicode 標(biāo)量(scalar)組成,那么也認(rèn)為這兩個(gè)字符串相等:

let spain = "Espa?a"
let tilde = "u{303}"
let country = "Espan" + "(tilde)" + "a"
**if** country == spain {
  print("滿足匹配!")       *// "滿足匹配!n"*
}

比較次序的話:

if "aaa" 前綴/后綴檢測(cè)檢測(cè)一個(gè)字符串是否擁有某個(gè)前綴或者后綴:

let line = "0001 這里放上一些測(cè)試數(shù)據(jù) %%%%"
line.hasPrefix("0001")    *// true*
line.hasSuffix("%%%%")    *// true大小寫互相轉(zhuǎn)換顧名思義:let mixedCase = "AbcDef"*
let upper = mixedCase.uppercaseString *// "ABCDEF"*
let lower = mixedCase.lowercaseString *// "abcdef"字符集合字符串并不是某種編碼的字符集合(collection views)览芳,但是它可以通過相應(yīng)的屬性為不同的編碼形式提供所對(duì)應(yīng)的字符集合斜姥。country.characters       // characters*
country.unicodeScalars   *// Unicode scalar 21-bit codes*
country.utf16            *// UTF-16 編碼*
country.utf8             *// UTF-8 編碼字符總數(shù)字符串并沒有一個(gè)直接的屬性用以返回其包含的字符總數(shù),因?yàn)樽址倲?shù)只對(duì)特定的編碼形式來說才有意義。因此铸敏,字符總數(shù)需要通過不同編碼的字符集合來訪問:// spain = Espa?a*
print("(spain.characters.count)")      *// 6*
print("(spain.unicodeScalars.count)")  *// 6*
print("(spain.utf16.count)")           *// 6*
print("(spain.utf8.count)")            *// 7使用索引來訪問字符集合每個(gè)字符集合都擁有“索引”缚忧,可以通過它來訪問整個(gè)集合中的元素。這或許是在使用字符串過程中碰到的最大難點(diǎn)之一了杈笔。你不能使用下標(biāo)語(yǔ)法來訪問字符串中的任意元素(比如說string[5])闪水。要遍歷某個(gè)集合中的所有元素的時(shí)候(從現(xiàn)在開始我都將使用 characters 集合),可以通過 for...in 循環(huán)來進(jìn)行:var sentence = "Never odd or even"*
for character in sentence.characters {
  print(character)
}

每個(gè)集合都有兩個(gè)實(shí)例屬性蒙具,你可以在集合中使用它們來進(jìn)行索引球榆,就如同下標(biāo)語(yǔ)法哪樣:

startIndex:返回首個(gè)元素的位置,如果為空禁筏,那么和 endIndex 的值相同持钉。
endIndex:返回字符串逾尾(past the end)的位置。
注意到如果使用 endIndex 的話篱昔,就意味著你不能直接將其作為下標(biāo)來進(jìn)行使用每强,因?yàn)檫@會(huì)導(dǎo)致越界。

let cafe = "café"
cafe.startIndex   *// 0*
cafe.endIndex     *// 4 - 最后一個(gè)字符之后的位置*

當(dāng)通過以下幾種方法進(jìn)行字符串修改的時(shí)候州刽,startIndex 和 endIndex 就變得極其有用:

successor():獲取下一個(gè)元素
predecessor():獲取上一個(gè)元素
advancedBy(n):向前或者向后跳 n 個(gè)元素

下面是一些用例空执,注意到如果必要的話你可以將操作串聯(lián)起來:

cafe[cafe.startIndex]                         *// "c"*
cafe[cafe.startIndex.successor()]             *// "a"*
cafe[cafe.startIndex.successor().successor()] *// "f"*
*// 注意到 cafe[endIndex] 會(huì)引發(fā)運(yùn)行時(shí)錯(cuò)誤*
cafe[cafe.endIndex.predecessor()]             *// "é"*
cafe[cafe.startIndex.advancedBy(2)]           *// "f"*

Indices 屬性將返回字符串中所有元素的范圍,這在遍歷集合的時(shí)候很有用:

for index in cafe.characters.indices {
  print(cafe[index])
}

你無法使用某個(gè)字符串中的索引來訪問另一個(gè)字符串穗椅。你可以通過 distanceTo 方法將索引轉(zhuǎn)換為整數(shù)值:

let word1 = "ABCDEF"
let word2 = "012345"
let indexC = word1.startIndex.advancedBy(2)
let distance = word1.startIndex.distanceTo(indexC) *// 2*
let digit = word2[word2.startIndex.advancedBy(distance)] *// "2"*

范圍的使用

要檢出字符串集合中某個(gè)范圍內(nèi)的元素的話辨绊,可以使用范圍。范圍可以通過 start 和 end 索引來完成創(chuàng)建:'

let fqdn = "useyourloaf.com"
let rangeOfTLD = **Range**(start: fqdn.endIndex.advancedBy(-3), 
                         end: fqdn.endIndex)
let tld = fqdn[rangeOfTLD] *// "com"*

使用 “…” 或者 “..


通過索引或者范圍來截取字符串

要通過索引或者范圍來截取字符串的話匹表,有許多方法:

獲取前綴或者后綴

如果你需要得到或者拋棄字符串前面或者后面的某些元素的話门坷,可以:

let digits = "0123456789"
let tail = **String**(digits.characters.dropFirst())  *// "123456789"*
let less = **String**(digits.characters.dropFirst(3)) *// "23456789"*
let head = **String**(digits.characters.dropLast(3))  *// "0123456"*
 
let prefix = **String**(digits.characters.prefix(2))  *// "01"*
let suffix = **String**(digits.characters.suffix(2))  *// "89"*
 
let index4 = digits.startIndex.advancedBy(4)
let thru4 = **String**(digits.characters.prefixThrough(index4)) *// "01234"*
let upTo4 = **String**(digits.characters.prefixUpTo(index4))    *// "0123"*
let from4 = **String**(digits.characters.suffixFrom(index4))    *// "456789"*

插入或刪除

要在指定位置插入字符的話,可以通過索引:

var stars = "******"
stars.insert("X", atIndex: stars.startIndex.advancedBy(3))
*// "***X***"*

要在索引出插入字符串的話桑孩,那么需要將字符串轉(zhuǎn)換為字符集:

stars.insertContentsOf("YZ".characters, at: stars.endIndex.advancedBy(-3))
*// "***XYZ***"*

范圍替換

要替換一個(gè)范圍的字符串內(nèi)容的話:

添加元素

可以通過“+”運(yùn)算符將字符串相互連接起來,也可以使用 appendContentsOf 方法:

var message = "Welcome"
message += " Tim" *// "Welcome Tim"*
message.appendContentsOf("!!!") *// "Welcome Tim!!!*

移除或者返回指定索引的元素

從一個(gè)字符串當(dāng)中移除某個(gè)元素框冀,需要注意這個(gè)方法將會(huì)使該字符串此前所有的任何索引標(biāo)記(indice)失效流椒。

var grades = "ABCDEF"
let ch = grades.removeAtIndex(grades.startIndex) *// "A"*
print(grades) *// "BCDEF"*

范圍移除

移除字符集中某個(gè)范圍的字符,需要主要的是這個(gè)方法同樣也會(huì)使索引標(biāo)記失效:

var sequences = "ABA BBA ABC"
let midRange = sequences.startIndex.advancedBy(4)...sequences.endIndex.advancedBy(-4)
sequences.removeRange(midRange)  *// "ABA ABC"*

與 NSString 橋接

String 可以轉(zhuǎn)換為 NSString 從而與 Objective-C 橋接明也。如果 Swift 標(biāo)準(zhǔn)庫(kù)沒有你所需要的功能的話宣虾,那么導(dǎo)入 Foundation 框架,通過 NSString 來訪問這些你所需要的方法温数。

請(qǐng)注意這個(gè)橋接方法并不是無損的绣硝,因此盡可能使用 Swift 標(biāo)準(zhǔn)庫(kù)完成大部分功能。

// 不要忘記導(dǎo)入 Foundation*
import **Foundation**
let welcome = "hello world!"
welcome.capitalizedString     *// "Hello World!"*

檢索內(nèi)含的字符串

使用 NSString 方法的一個(gè)例子就是執(zhí)行內(nèi)含字符串的檢索:

let text = "123045780984"
**if** let rangeOfZero = text.rangeOfString("0",
       options: NSStringCompareOptions.**BackwardsSearch**) {
  *// 尋找“0”元素撑刺,然后獲取之后的元素*
  let suffix = **String**(text.characters.suffixFrom(rangeOfZero.endIndex)) *// "984"*
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹉胖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甫菠,老刑警劉巖挠铲,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寂诱,居然都是意外死亡拂苹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門痰洒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓢棒,“玉大人,你說我怎么就攤上這事丘喻「蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵仓犬,是天一觀的道長(zhǎng)嗅绰。 經(jīng)常有香客問我,道長(zhǎng)搀继,這世上最難降的妖魔是什么窘面? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮叽躯,結(jié)果婚禮上财边,老公的妹妹穿的比我還像新娘。我一直安慰自己点骑,他們只是感情好酣难,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黑滴,像睡著了一般憨募。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袁辈,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天菜谣,我揣著相機(jī)與錄音,去河邊找鬼晚缩。 笑死尾膊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荞彼。 我是一名探鬼主播冈敛,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鸣皂!你這毒婦竟也來了抓谴?” 一聲冷哼從身側(cè)響起暮蹂,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎齐邦,沒想到半個(gè)月后椎侠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡措拇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年我纪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丐吓。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浅悉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出券犁,到底是詐尸還是另有隱情术健,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布粘衬,位于F島的核電站荞估,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏稚新。R本人自食惡果不足惜勘伺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褂删。 院中可真熱鬧飞醉,春花似錦、人聲如沸屯阀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)难衰。三九已至钦无,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盖袭,已是汗流浹背失暂。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苍凛,地道東北人趣席。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓兵志,卻偏偏與公主長(zhǎng)得像醇蝴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子想罕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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