字串與字元
字串
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 Literals,Swift 也包括大多數類似的逸出字元,包括
- 跳脫字元\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 的字元叫 Character,String 其實是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 一節
留言列表