Swift-字符串和字符

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

初始化字符串

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類型是一個值類型。 如果創建一個新的字符串值,那么該字符串值在傳遞給函數或方法時或者在賦給常量或變量時被復制。 在每種情況下,將創建現有String值的新副本,并傳遞或分配新副本,而不是原始版本。
Swift的按默認值復制String的行為確保當一個函數或方法傳遞一個String值時,很明顯你擁有該精確的String值,而不管它來自哪里。 您可以確信,您傳遞的字符串不會被修改,除非您自己修改它。

字符

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

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

或者,您可以通過提供字符類型注釋,從單字符字符串文字創建獨立的字符常量或變量:

let exclamationMark: Character = "!"

可以通過將字符值數組作為參數傳遞給它的初始化器來構造字符串值:

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

拼接字符串和字符

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

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

您還可以使用附加賦值運算符(+ =)將String值附加到現有的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!"

注意:您不能將字符串或字符附加到現有的字符變量,因為字符值只能包含一個字符。

字符串插入

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

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

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

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

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

  • 轉義的特殊字符\ 0(空字符),\(反斜杠),\ t(水平制表符),\ n(換行),\ r(回車) )
  • 任意Unicode標量,寫為\ u {n},其中n是一個1-8位的十六進制數,值等于有效的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

計數字符

要檢索字符串中的字符值的計數,請使用字符串的characters屬性的count屬性:

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

訪問和修改字符串

  • 您可以通過其方法和屬性或通過使用下標語法來訪問和修改字符串。
  • 每個String值都有一個相關的索引類型String.Index,它對應于字符串中每個字符的位置。
  • 如上所述,不同的字符可能需要不同數量的內存來存儲,因此為了確定哪個字符在特定位置,您必須從該字符串的開頭或結尾遍歷每個Unicode標量。 因此,Swift字符串不能用整數值索引。
  • 使用startIndex屬性訪問字符串的第一個字符的位置。 endIndex屬性是字符串中最后一個字符之后的位置。 因此,endIndex屬性不是字符串下標的有效參數。 如果String為空,startIndex和endIndex相等。
  • 使用String的index(before :)和index(after :)方法之前,可以訪問給定索引前后的索引。 要訪問遠離給定索引的索引,可以使用索引(_:offsetBy :)方法,而不是多次調用這些方法。
  • 您可以使用下標語法來訪問特定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協議的任何類型上使用startIndex和endIndex屬性和索引(before :),index(after :)和index(_:offsetBy :)方法。 這包括String,如下所示,以及集合類型,如Array,Dictionary和Set。

插入和刪除

要在指定索引處將單個字符插入到字符串中,請使用insert(_:at :)方法,并在指定索引處插入另一個字符串的內容,請使用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 :)方法,并刪除指定范圍內的子字符串,請使用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協議的任何類型上使用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"

前綴和后綴相等

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

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數組來計算播放的Act 1中的場景數量:
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(_ :)方法在每個字符串中的擴展字形集群之間執行逐個字符的規范等價比較,如字符串和字符平等中所述。

字符串的Unicode表示形式

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

  • 一組UTF-8代碼單元(使用字符串的utf8屬性訪問)
  • 一組UTF-16代碼單元(使用字符串的utf16屬性訪問)
  • 21位Unicode標量值的集合,等同于字符串的UTF-32編碼形式(使用字符串的unicodeScalars屬性訪問)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容

  • 一個字符串 是一系列字符的集合,例如hello, world和albatross。Swift的字符串是String...
    BoomLee閱讀 2,411評論 0 3
  • String是例如"hello, world","albatross"這樣的有序的Character(字符)類型的...
    窮人家的孩紙閱讀 860評論 2 1
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 字符串字面量 字符串字面量是由雙引號("")包裹著具有固定順序的文本字符集,可以用來給常量或者變量提供初始值。在S...
    clegec閱讀 409評論 0 0
  • 因為寫文章要配圖,這兩天一直在翻我們的群相冊,發現一件非常interesting的事情,為何只有象小巧和大象的親密...
    小仙女要下凡了閱讀 343評論 0 0