close

字串與字元

 

字串

Swift 原則上都使用 String 型。不再使用 char Objective-C 常用的 NSString, NSString 比較的話, Swift String NSString 更為方便好用

 

Swift String型別與 Foundation NSString類別進行了無縫橋接。如果你利用 Cocoa Cocoa Touch 中的 Foundation Framework 進行工作。所有NSString API 都可以呼叫你創建的任意String型別的值。

 

字串通常我們String Literals 的方式產生,字面翻成字符,也就是用文字表示的一種方法,最書最前面的 Hello World 就是一個實例,最簡單的 Literals 就是把要產生的字串雙引號中間,例如

 

"Hello World"

 

如同 Objective-C NSString LiteralsSwift 也包括大多數類似的逸出字元,包括

 

  • 跳脫字元\0(空字元)\\(反斜線)\t(水平 tab)\n(換行)\r(return)\"(引號)\'(單引號)
  • 單位元組 Unicode 純量,寫成\xnn,其中nn為兩位十六進制數。
  • 雙位元組 Unicode 純量,寫成\unnnn,其中nnnn為四位十六進制數。
  • 四位元組 Unicode 純量,寫成\Unnnnnnnn,其中nnnnnnnn為八位十六進制數。

 

Swift 有一個特別的逸出字元寫法,就是 \(  ) 括號中間要放一個任何有回傳值為字串或數值的東西,如變數,計算式,或另一個 Literals, 以下是一些常見的寫法:

 

var int = 123

var bool = true

var uint:UInt = 123

var double = 22.323e100

var string = "String"

 

print("Hello \(123) World")       //"Hello 123 World")

print("Hello \("String") World"//"Hello String World")

print("Hello \(123>5) World")     //"Hello true World")

print("Hello \(int) World")       //"Hello 123 World")

print("Hello \(bool) World")      //"Hello true World")

print("Hello \(uint) World")      //"Hello 123 World")

print("Hello \(double) World")    //"Hello 2.2323e+101 World")

 

 

字串也可以使用 +】作為連結運算使用,

 

var a = "Hello"

var b = "World"

var s = " "

 

print(a+s+b) //"Hello World"

 

字元

Swift 的字元叫 CharacterString 其實是Character的集合。Character 支援 Unicode,由於Unicode表示方式可能需要不同數量的記憶體空間來儲存,所以每個字元在一個字串中並不一定占用相同的記憶體空間。但也因為如此,它可以直接支援使用 Unicode的各國文字,也包括繪文字(emoje)

 

Character 雖然是 String 的組成元素,但這不代表它是 String 所以不能與 String 做連結運算,要用 List,也不能直接轉成數值,必需先轉成 String 才行。

 

我們在產生字元的時候,是用雙引號內含一個字元的方式產生,但實際上若未指定的話,Swift 會視為 String,所以使用時要特別注意型別的轉換

 

var c1 = 1

var c2 = "2"

print(type(of:c1))  // 輸出 Int

print(type(of:c2))  // 輸出 String

 

 

字串與數值資料類型轉換

Swift 中,數值轉成字串,就是用前面字串一節介紹的 Literals,但字串轉成數值,就有一點和 Objective-C 不同。

 

Objective-C 中,字串轉成數值,通常是呼叫 NSString method,如 NSString int 時,是用 [String intValue] 這個 method 例:

 

NSString *inputString = @"75";       

int value = [inputString intValue];

NSLog(@"%i",value);  //輸出 75

 

但在 Swift 中,String Int 時,用的是 Int 的建構子  Int(),例如:

 

let theString = "75"

let theInt = Int(theString)

print(theInt!) //輸出 75,其實這樣寫不太好....

print(theInt//輸出 Optional(75),好像不太對....

 

若讀者有注意到,你會發現在 pinrt 時,多了一個驚嘆號【!】,這是一個 Swift才有的特性, 叫做 Optional, 用來處理可能會出錯的事。

 

Objective-C 中,若是你用 [@"七十" intValue] 回傳的結果會是 0 因為中文字 "七十" 是無法正確轉換的,在無法轉換時intValue 會回傳 0,但是用 Swift Int() 時,若無法轉換時,輸出的不是 0 而是 nil nil 是無法放在 Int上的,若我們試著指定型別而放到變數時,是會出錯的。

 

為了處理這個狀,Swift ValueType 都有一個附加的類型叫 Optional,也就是可以接收 nil 的類型,我們下一節再討論 Optional,我們先了解一下如何仿 Objective-C 的方法來處理這個問題。

 

舉個明顯的案例,若上例中,指定轉出的型別的話,會出現以下的錯誤:

 

let theString = "75"

let theInt:Int = Int(theString) //error: value of optional type 'Int?'

 

在這個例子中,我們指定了常數的型別,結果就放不進去了,有很多方法可以解決問題,其中若要做到類似 Objective-C 的轉換失敗時傳值為 0 的話,要這樣寫:

 

let theString = "75"

let theInt:Int = Int(theString) ?? 0

print(theInt//輸出 75

 

這樣的效果就會和之前的 Objective-C 程式有類似的效果了。 ??】是一個nil coalescing 運算子,其作用方法之後的進階運算子一節會詳作說明,簡單的說

a = b ?? c 就等於 if ( b == nil ){ a = b }else{ a = c }

 

我們實際在處理時,Optional 有許多可以處理的方法,請詳看 Optional 一節

 

arrow
arrow
    全站熱搜

    shenfive 發表在 痞客邦 留言(0) 人氣()