鍍金池/ 教程/ iOS/ 字符串和字符(Strings and Characters)
特性(Attributes)
Access Control 權(quán)限控制的黑與白
基本運(yùn)算符(Basic Operators)
基礎(chǔ)部分(The Basics)
閉包(Closures)
擴(kuò)展
泛型參數(shù)(Generic Parameters and Arguments)
訪問控制和 protected
語句(Statements)
模式(Patterns)
WWDC 里面的那個(gè)“大炮打氣球”
關(guān)于語言參考(About the Language Reference)
語法總結(jié)(Summary of the Grammar)
嵌套類型
類型(Types)
Swift 初見(A Swift Tour)
泛型
枚舉(Enumerations)
高級(jí)運(yùn)算符
繼承
析構(gòu)過程
關(guān)于 Swift(About Swift)
訪問控制
類和結(jié)構(gòu)體
內(nèi)存安全
Swift 與 C 語言指針友好合作
協(xié)議
屬性(Properties)
可選類型完美解決占位問題
錯(cuò)誤處理
字符串和字符(Strings and Characters)
聲明(Declarations)
自動(dòng)引用計(jì)數(shù)
Swift 里的值類型與引用類型
表達(dá)式(Expressions)
Swift 文檔修訂歷史
造個(gè)類型不是夢(mèng)-白話 Swift 類型創(chuàng)建
歡迎使用 Swift
詞法結(jié)構(gòu)(Lexical Structure)
集合類型(Collection Types)
下標(biāo)
方法(Methods)
可選鏈?zhǔn)秸{(diào)用
版本兼容性
類型轉(zhuǎn)換
構(gòu)造過程
The Swift Programming Language 中文版
函數(shù)(Functions)
Swift 教程
控制流(Control Flow)

字符串和字符(Strings and Characters)


1.0 翻譯:wh1100717 校對(duì):Hawstein

2.0 翻譯+校對(duì):DianQK

2.1 翻譯:DianQK 校對(duì):shanks, Realank,

2.2 校對(duì):SketchK

3.0 校對(duì):CMB,版本日期:2016-09-13 3.0.1, shanks, 2016-11-11

4.0 翻譯:kemchenj 2017-09-21

4.1 翻譯+校對(duì):mylittleswift

本頁包含內(nèi)容:

字符串是是一系列字符的集合,例如 "hello, world""albatross"。Swift 的字符串通過 String 類型來表示。 一個(gè) String 的內(nèi)容可以用許多方式讀取,包括作為一個(gè) Character 值的集合。

Swift 的 StringCharacter 類型提供了快速和兼容 Unicode 的方式供你的代碼使用。創(chuàng)建和操作字符串的語法與 C 語言中字符串操作相似,輕量并且易讀。字符串連接操作只需要簡(jiǎn)單地通過 + 符號(hào)將兩個(gè)字符串相連即可。與 Swift 中其他值一樣,能否更改字符串的值,取決于其被定義為常量還是變量。你也可以在字符串內(nèi)插過程中使用字符串插入常量、變量、字面量表達(dá)成更長(zhǎng)的字符串,這樣可以很容易的創(chuàng)建自定義的字符串值,進(jìn)行展示、存儲(chǔ)以及打印。

盡管語法簡(jiǎn)易,但 String 類型是一種快速、現(xiàn)代化的字符串實(shí)現(xiàn)。 每一個(gè)字符串都是由編碼無關(guān)的 Unicode 字符組成,并支持訪問字符的多種 Unicode 表示形式。

注意

Swift 的 String 類型與 Foundation NSString 類進(jìn)行了無縫橋接。Foundation 也可以對(duì) String 進(jìn)行擴(kuò)展,暴露在 NSString 中定義的方法。 這意味著,如果你在 String 中調(diào)用這些 NSString 的方法,將不用進(jìn)行轉(zhuǎn)換。

更多關(guān)于在 Foundation 和 Cocoa 中使用 String 的信息請(qǐng)查看 Using Swift with Cocoa and Objective-C (Swift 4)。

字符串字面量

你可以在代碼里使用一段預(yù)定義的字符串值作為字符串字面量。字符串字面量是由一對(duì)雙引號(hào)包裹著的具有固定順序的字符集。

字符串字面量可以用于為常量和變量提供初始值:

let someString = "Some string literal value"

注意 someString 常量通過字符串字面量進(jìn)行初始化,Swift 會(huì)推斷該常量為 String 類型。

多行字符串字面量

如果你需要一個(gè)字符串是跨越多行的,那就使用多行字符串字面量 — 由一對(duì)三個(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è)多行字符串字面量包含了所有的在開啟和關(guān)閉引號(hào)(""")中的行。這個(gè)字符從開啟引號(hào)(""")之后的第一行開始,到關(guān)閉引號(hào)(""")之前為止。這就意味著字符串開啟引號(hào)之后(""")或者結(jié)束引號(hào)(""")之前都沒有換行符號(hào)。(譯者:下面兩個(gè)字符串其實(shí)是一樣的,雖然第二個(gè)使用了多行字符串的形式)

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

如果你的代碼中,多行字符串字面量包含換行符的話,則多行字符串字面量中也會(huì)包含換行符。如果你想換行,以便加強(qiáng)代碼的可讀性,但是你又不想在你的多行字符串字面量中出現(xiàn)換行符的話,你可以用在行尾寫一個(gè)反斜杠(\)作為續(xù)行符。

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."
"""

為了讓一個(gè)多行字符串字面量開始和結(jié)束于換行符,請(qǐng)將換行寫在第一行和最后一行,例如:

let lineBreaks = """

This string starts with a line break.
It also ends with a line break.

"""

一個(gè)多行字符串字面量能夠縮進(jìn)來匹配周圍的代碼。關(guān)閉引號(hào)(""")之前的空白字符串告訴 Swift 編譯器其他各行多少空白字符串需要忽略。然而,如果你在某行的前面寫的空白字符串超出了關(guān)閉引號(hào)(""")之前的空白字符串,則超出部分將被包含在多行字符串字面量中。

在上面的例子中,盡管整個(gè)多行字符串字面量都是縮進(jìn)的(源代碼縮進(jìn)),第一行和最后一行沒有以空白字符串開始(實(shí)際的變量值)。中間一行的縮進(jìn)用空白字符串(源代碼縮進(jìn))比關(guān)閉引號(hào)(""")之前的空白字符串多,所以,它的行首將有4個(gè)空格。

字符串字面量的特殊字符

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

  • 轉(zhuǎn)義字符 \0(空字符)、\\(反斜線)、\t(水平制表符)、\n(換行符)、\r(回車符)、\"(雙引號(hào))、\'(單引號(hào))。
  • Unicode 標(biāo)量,寫成 \u{n}(u 為小寫),其中 n 為任意一到八位十六進(jìn)制數(shù)且可用的 Unicode 位碼。

下面的代碼為各種特殊字符的使用示例。 wiseWords 常量包含了兩個(gè)雙引號(hào)。 dollarSignblackHeartsparklingHeart 常量演示了三種不同格式的 Unicode 標(biāo)量:

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imageination is more important than knowledge" - Enistein
let dollarSign = "\u{24}"             // $,Unicode 標(biāo)量 U+0024
let blackHeart = "\u{2665}"           // ?,Unicode 標(biāo)量 U+2665
let sparklingHeart = "\u{1F496}"      //