標籤: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入門(二)——字元與字串