Swift入門(二)——字元與字串

來源:互聯網
上載者:User

標籤:swift   字元   unicode   入門   字串   

Swift字元定義

Swift中的字元,與OC有些不同,每一個字元代表了一個可拓展的字母集,可拓展的字母集由若干個(大於等於一個)Unicode標量值表示,這些標量構成了一個可拓展的字母集,也就是一個人類可讀的字元。

Unicode標量

一個Unicode標量佔據21個位元位,一般格式為“U+xxxx”,這個解釋有點抽象,其實我們通常理解的一個字母,也可以用一個Unicode標量來表示,比如字母’a’可以表示為”U+0061”。

剛剛說到,一個字元由若干個Unicode標量表示,比如以下這個例子:

let combine1 = "\u{1112}"let combine2 = "\u{1112}\u{1161}"let combine3 = "\u{1112}\u{1161}\u{11AB}"println("combine1 = \(combine1)")println("combine2 = \(combine2)")println("combine3 = \(combine3)")

輸出結果是

combine1 = ?
combine2 = ??
combine3 = ???

可見,對於一個字元,並不一定是由一個Unicode標量構成的。比如“???”。

字元類型推導

剛剛的例子中,我們定義了三個常量,combine0,,combine1,combine2,他們被推導為什麼類型呢?答案是String類型而不是Character類型,個人猜測是Swfit的寬類型優先導致的。這裡通過簡單的代碼驗證一下:

var combine0 = "\u{1112}"var combine1:Character = "\u{1112}"combine0 += "abc" //正確combine1 += "abc" //編譯錯誤:無法將String類型與Character類型變數拼接
字元拼接

在初始化字元類型常量或變數時,Swift會自動把能夠拼接的Unicode標量拼接成一個人類可讀字元,如果不能拼接,將產生一個由多個字元所組成的字串。把這個值賦給一個已經標註為Character類型的變數會導致編譯錯誤。

var string = "\u{1112}\u{10FFFF}" //正確,string變數被推導為String類型var c:Character = "\u{1112}\u{10FFFF}" //錯誤,無法賦值給Character類型變數
Swift字串定義

Swift中的字串由若干個字元構成。

字串初始化

一共有兩種方式可以進行字串初始化,代碼如下:

var emptyString1 = ""var emptyString2 = String()

這樣就建立了一個Null 字元串,可以用字串的isEmpty屬性來檢驗:

if emptyString1.isEmpty{    println("emptyString1 is empty")}if emptyString2.isEmpty{    println("emptyString2 is empty")}

輸出結果是:

emptyString1 is emptyemptyString2 is empty
字串拼接

字串之間可以相加,等號左側必須是變數,不能是常量。
字串變數還可以調用append方法串連其他字元。需要注意的是,append方法只能串連字元,不能連接字串。

var combine1 = "\u{1112}"let combine2 = "\u{1112}\u{1161}"combine1 += combine2 //正確combine2 += combine1 //錯誤var char:Character = "a"combine1.append(char) //正確combine1.append("a") //即使寫成這樣也會報錯,原因不明,可能是推導為String類型了
字串計數

由於一個字元由若干個Unicode標量組成,所以無法使用字串大小除以單個字串大小來計算字串長度。可以利用count方法來計算字串長度:

let stringValue1 = "Hello, world"let stringValue2 = "\u{65}\u{301}"println("string1 length = \(count(stringValue1))")println("string2 length = \(count(stringValue2))")println("string2 = \(stringValue2)")

之前說過字元的自動拼接,所以運行結果如下:

string1 length = 12
string2 length = 1
string2 = e?

字串插入

這個類似於OC中的NSString stringWithFormat方法。可以通過已有字串或數字等其他變數構建一個新的字串,通過一個例子示範一下:

var number = 3var time = 2var setence = "\(number)的 \(time)倍是 \(number * time)"println("setence = \(setence)")

對應到OC的方法,就相當於用”\()”替換了”%@”。
需要注意的是,插入的運算式中不能直接包含雙引號、單引號或者反斜線。

字串比較

通過 == 和 != 運算子來比較字串是否相等

比較特殊的一點是,swift在比較兩個字串時,並不會逐一比較每個Unicode標量是否相等,而是會根據字串的實際語義來比較。所以在下面的例子中,比較結果需要特別留心一下:

var compare1 = "caf\u{E9}" //\u{E9}是帶聲調的e,形如e?var compare2 = "caf\u{65}\u{301}" //這是字母e加上聲調合成的e?if compare1 == compare2{    //它們依然是相等的    println("\(compare1) is equal to \(compare2)")}var compare3 = "\u{41}" //拉丁字母Avar compare4 = "\u{0410}" //斯拉夫字母Aif compare3 != compare4{    //雖然表現相同,但實際語義不同,所以字串依然不同    println("\(compare3) is not equal to \(compare4)")}

運行結果如下:

café is equal to cafe?
A is not equal to А

字串前尾碼

字串有hasPrefix和hasSuffix方法,用於判斷這個字串是否包含某個前(後)綴,返回一個Bool類型值。注意這兩個方法是區分大小寫

var preFixAndSuffix = "Hello World"if preFixAndSuffix.hasPrefix("H"){    println("\(preFixAndSuffix) has prefix \"H\"")}if preFixAndSuffix.hasPrefix("h"){    println("\(preFixAndSuffix) has prefix \"h\"")}if preFixAndSuffix.hasSuffix("rld"){    println("\(preFixAndSuffix) has suffix \"rld\"")}if preFixAndSuffix.hasSuffix("rldd"){    println("\(preFixAndSuffix) has suffix \"rldd\"")}

輸出結果:

Hello World has prefix "H"Hello World has suffix "rld"

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Swift入門(二)——字元與字串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.