Swift-字符串和字符

Swift的String類型是用Foundation的NSString類來橋接的。 Foundation還擴展了String以公開NSString定義的方法龙填。 這意味著,如果您導入Foundation,則可以在String上訪問這些NSString方法,而不進行轉(zhuǎn)換皆的。

初始化字符串

var emptyString = ""               // empty string literal
var anotherEmptyString = String()  // initializer syntax
// these two strings are both empty, and are equivalent to each other

判斷字符串是否為空

if emptyString.isEmpty {
    print("Nothing to see here")
}
// Prints "Nothing to see here"

可變字符串

您可以指定特定的字符串是否可以通過將其賦值給變量(在這種情況下可以修改)或常量(在這種情況下不能修改)來決定是否修改(或改變):

var variableString = "Horse"
variableString += " and carriage"
// variableString is now "Horse and carriage"

//常量字符串不能被修改
let constantString = "Highlander"
constantString += " and another Highlander"
// this reports a compile-time error - a constant string cannot be modified

這種方法不同于Objective-C和Cocoa中的字符串變量,您可以在兩個類(NSString和NSMutableString)之間進行選擇居灯,以指示字符串是否可以進行改變祭务。

字符串是值類型

Swift的String類型是一個值類型内狗。 如果創(chuàng)建一個新的字符串值怪嫌,那么該字符串值在傳遞給函數(shù)或方法時或者在賦給常量或變量時被復制。 在每種情況下柳沙,將創(chuàng)建現(xiàn)有String值的新副本岩灭,并傳遞或分配新副本,而不是原始版本赂鲤。
Swift的按默認值復制String的行為確保當一個函數(shù)或方法傳遞一個String值時噪径,很明顯你擁有該精確的String值柱恤,而不管它來自哪里。 您可以確信找爱,您傳遞的字符串不會被修改梗顺,除非您自己修改它。

字符

您可以通過使用for-in循環(huán)遍歷其字符屬性來訪問字符串的各個字符值:

for character in "Dog!??".characters {
    print(character)
}
// D
// o
// g
// !
// ??

或者车摄,您可以通過提供字符類型注釋寺谤,從單字符字符串文字創(chuàng)建獨立的字符常量或變量:

let exclamationMark: Character = "!"

可以通過將字符值數(shù)組作為參數(shù)傳遞給它的初始化器來構(gòu)造字符串值:

let catCharacters: [Character] = ["C", "a", "t", "!", "??"]
let catString = String(catCharacters)
print(catString)
// Prints "Cat!??"

拼接字符串和字符

字符串值可用加法運算符(+)一起添加(或連接),以創(chuàng)建新的字符串值:

let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome now equals "hello there"

您還可以使用附加賦值運算符(+ =)將String值附加到現(xiàn)有的String變量:

var instruction = "look over"
instruction += string2
// instruction now equals "look over there"

您可以使用String類的append()方法將Character值拼接到String變量:

let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome now equals "hello there!"

注意:您不能將字符串或字符附加到現(xiàn)有的字符變量吮播,因為字符值只能包含一個字符变屁。

字符串插入

字符串插值是通過將常量,變量意狠,文字和表達式的值包含在字符串文字中來從常量粟关,變量,文字和表達式的混合構(gòu)造新的String值的一種方法环戈。 您插入到字符串文字中的每個項都包含在一對括號中闷板,前綴為反斜杠:

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"

在插入字符串中的括號內(nèi)寫入的表達式不能包含未轉(zhuǎn)義的反斜杠(\),回車或換行符院塞。 但是蛔垢,它們可以包含其他字符串文字。

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

字符串文字可以包含以下特殊字符:

  • 轉(zhuǎn)義的特殊字符\ 0(空字符)迫悠,\(反斜杠)鹏漆,\ t(水平制表符),\ n(換行)创泄,\ r(回車) )
  • 任意Unicode標量艺玲,寫為\ u {n},其中n是一個1-8位的十六進制數(shù)鞠抑,值等于有效的Unicode代碼點
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

計數(shù)字符

要檢索字符串中的字符值的計數(shù)饭聚,請使用字符串的characters屬性的count屬性:

let unusualMenagerie = "Koala ??, Snail ??, Penguin ??, Dromedary ??"
print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
// Prints "unusualMenagerie has 40 characters"

訪問和修改字符串

  • 您可以通過其方法和屬性或通過使用下標語法來訪問和修改字符串。
  • 每個String值都有一個相關(guān)的索引類型String.Index搁拙,它對應于字符串中每個字符的位置秒梳。
  • 如上所述,不同的字符可能需要不同數(shù)量的內(nèi)存來存儲箕速,因此為了確定哪個字符在特定位置酪碘,您必須從該字符串的開頭或結(jié)尾遍歷每個Unicode標量。 因此盐茎,Swift字符串不能用整數(shù)值索引兴垦。
  • 使用startIndex屬性訪問字符串的第一個字符的位置。 endIndex屬性是字符串中最后一個字符之后的位置。 因此探越,endIndex屬性不是字符串下標的有效參數(shù)狡赐。 如果String為空,startIndex和endIndex相等钦幔。
  • 使用String的index(before :)和index(after :)方法之前枕屉,可以訪問給定索引前后的索引。 要訪問遠離給定索引的索引鲤氢,可以使用索引(_:offsetBy :)方法搀庶,而不是多次調(diào)用這些方法。
  • 您可以使用下標語法來訪問特定String索引處的字符铜异。
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a

使用characters屬性的indices屬性訪問字符串中各個字符的所有索引哥倔。

for index in greeting.characters.indices {
    print("\(greeting[index]) ", terminator: "")
}
// Prints "G u t e n   T a g ! "

注意:您可以在符合Collection協(xié)議的任何類型上使用startIndex和endIndex屬性和索引(before :),index(after :)和index(_:offsetBy :)方法揍庄。 這包括String咆蒿,如下所示,以及集合類型蚂子,如Array沃测,Dictionary和Set。

插入和刪除

要在指定索引處將單個字符插入到字符串中食茎,請使用insert(_:at :)方法蒂破,并在指定索引處插入另一個字符串的內(nèi)容,請使用insert(contents Of:a :)方法别渔。

var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"

welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"

要從指定索引的字符串中刪除單個字符附迷,請使用remove(at :)方法,并刪除指定范圍內(nèi)的子字符串哎媚,請使用removeSubrange(_ :)方法:

welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"

注意:您可以在符合RangeReplaceableCollection協(xié)議的任何類型上使用insert(:at :)喇伯,insert(contentsOf:at :),remove(at :)和removeSubrange( :)方法拨与。 這包括String稻据,以及集合類型,如Array买喧,Dictionary和Set捻悯。

比較字符串

Swift提供了三種比較文本值的方法:字符串和字符相等,前綴相等和后綴相等淤毛。

字符串和字符相等

字符串和字符相等性通過“等于”運算符(==)和“不等于”運算符(今缚!=)進行檢查。

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"

前綴和后綴相等

要檢查字符串是否有特定的字符串前綴或后綴钱床,請調(diào)用字符串的hasPrefix(_ :)和hasSuffix(_ :)方法荚斯,它們都接受一個類型為String的參數(shù)埠居,并返回一個布爾值查牌。

let romeoAndJuliet = [
    "Act 1 Scene 1: Verona, A public place",
    "Act 1 Scene 2: Capulet's mansion",
    "Act 1 Scene 3: A room in Capulet's mansion",
    "Act 1 Scene 4: A street outside Capulet's mansion",
    "Act 1 Scene 5: The Great Hall in Capulet's mansion",
    "Act 2 Scene 1: Outside Capulet's mansion",
    "Act 2 Scene 2: Capulet's orchard",
    "Act 2 Scene 3: Outside Friar Lawrence's cell",
    "Act 2 Scene 4: A street in Verona",
    "Act 2 Scene 5: Capulet's mansion",
    "Act 2 Scene 6: Friar Lawrence's cell"
]
你可以使用haseprefix(_ :)方法和romeoAndJuliet數(shù)組來計算播放的Act 1中的場景數(shù)量:
var act1SceneCount = 0
for scene in romeoAndJuliet {
    if scene.hasPrefix("Act 1 ") {
        act1SceneCount += 1
    }
}
print("There are \(act1SceneCount) scenes in Act 1")
// Prints "There are 5 scenes in Act 1"

注意:hasPrefix(_ :)和hasSuffix(_ :)方法在每個字符串中的擴展字形集群之間執(zhí)行逐個字符的規(guī)范等價比較事期,如字符串和字符平等中所述。

字符串的Unicode表示形式

使用三種其他符合Unicode的表示之一訪問字符串值:

  • 一組UTF-8代碼單元(使用字符串的utf8屬性訪問)
  • 一組UTF-16代碼單元(使用字符串的utf16屬性訪問)
  • 21位Unicode標量值的集合纸颜,等同于字符串的UTF-32編碼形式(使用字符串的unicodeScalars屬性訪問)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兽泣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胁孙,更是在濱河造成了極大的恐慌唠倦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涮较,死亡現(xiàn)場離奇詭異稠鼻,居然都是意外死亡,警方通過查閱死者的電腦和手機狂票,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門候齿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闺属,你說我怎么就攤上這事慌盯。” “怎么了掂器?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵亚皂,是天一觀的道長。 經(jīng)常有香客問我国瓮,道長灭必,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任乃摹,我火速辦了婚禮厂财,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峡懈。我一直安慰自己璃饱,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布肪康。 她就那樣靜靜地躺著荚恶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磷支。 梳的紋絲不亂的頭發(fā)上谒撼,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音雾狈,去河邊找鬼廓潜。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辩蛋。 我是一名探鬼主播呻畸,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悼院!你這毒婦竟也來了伤为?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤据途,失蹤者是張志新(化名)和其女友劉穎绞愚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颖医,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡位衩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了熔萧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚂四。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哪痰,靈堂內(nèi)的尸體忽然破棺而出遂赠,到底是詐尸還是另有隱情,我是刑警寧澤晌杰,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布跷睦,位于F島的核電站,受9級特大地震影響肋演,放射性物質(zhì)發(fā)生泄漏抑诸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一爹殊、第九天 我趴在偏房一處隱蔽的房頂上張望蜕乡。 院中可真熱鬧,春花似錦梗夸、人聲如沸层玲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辛块。三九已至,卻和暖如春铅碍,著一層夾襖步出監(jiān)牢的瞬間润绵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工胞谈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尘盼,地道東北人憨愉。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像卿捎,于是被迫代替她去往敵國和親配紫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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

  • 一個字符串 是一系列字符的集合娇澎,例如hello, world和albatross笨蚁。Swift的字符串是String...
    BoomLee閱讀 2,399評論 0 3
  • String是例如"hello, world"睹晒,"albatross"這樣的有序的Character(字符)類型的...
    窮人家的孩紙閱讀 852評論 2 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理趟庄,服務發(fā)現(xiàn),斷路器伪很,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 字符串字面量 字符串字面量是由雙引號("")包裹著具有固定順序的文本字符集戚啥,可以用來給常量或者變量提供初始值。在S...
    clegec閱讀 401評論 0 0
  • 因為寫文章要配圖锉试,這兩天一直在翻我們的群相冊猫十,發(fā)現(xiàn)一件非常interesting的事情,為何只有象小巧和大象的親密...
    小仙女要下凡了閱讀 341評論 0 0