Swift 入門指南 V1.00 - 單元 2 - 變數、常數與資料型態




變數 (variable) 就是可變的,這是說替變數建立初值後,還可以重新指派其他相同型態 (type) 的值。變數用關鍵字 var 宣告,而不可變的就是常數 (constant) ,這用 let 宣告



例如變數 a 的初值為 "Hello" ,接著又重新指派 "Hi""Sorry"a 之中


var a = "Hello"
a = "Hi"
a = "Sorry"

若是宣告建立多個變數,可以放在同一行並用逗號區隔


var b = 1, c = 2, d = "中文字串"
println(a)
println(c)
println(d)

任何 Unicode 字元 (character) 都能當作字串 (string) 內容,包括中文。

println() 為 Swift 標準程式庫 (standard library) 中可以直接使用的函數 (function) 之一,用來印出小括弧中提供的數值,我們對標準程式庫中的識別字採橄欖色的語法高亮度。

如果只想宣告變數名稱,就得加上型態標記 (type annotation) ,變數名稱後加上冒號,之後接型態的識別字 (identifier) ,如 String 為字串, Int 為整數 (integer) , Bool 為布林值


var f: String, i: Int, j: Bool
f = "There is no spoon."
i = 1
j = true

布林值就是真假值,「真」為關鍵字 (keyword) true ,「假」則是關鍵字 false

常數用關鍵字 let 宣告,例如


let e = 3.14

所謂常數就是建立初值後就不能重新指派新值,如果重新指派新值就會出錯,如



直接寫出來的整數如 22 ,浮點數如 0.12 ,字串如 "hello" ,這些被稱為字面常數 (literal) ,就是如字面不會更動的常數。

事實上我們 Playground 輸入的同時,例如輸入型態標記先輸入 I , Playground 就會自動出現所有以 I 起始的型態名稱,這時候按方向鍵選擇 Int 後,再按下 return 鍵就會自動完成輸入 Int



這是使用 IDE 的好處,我們在上圖也可以看到整數型態除了 Int 外,還有 Int16Int32Int64Int8 ,數字表示的是位元數,像 Int8 的意思是說 Int8 的整數範圍僅限 8 位元的二進位數字,也就是 Int8 型態的變數或常數只能在 -127128 之間。


Int8 之前若加上 U 變成 UInt8 ,這就是無正負號整數,範圍從 0255

另外所謂的型態係指物件 (object) 的型態,每一種都有屬性 (property) 及方法 (method) ,這需要用到小數點了,例如我們在空白一行輸入 f 後加入小數點



同樣 Playground 會出現提示選項,也就是所有可資利用的屬性及方法名稱,屬性就是物件中包含的值,方法則是做一些工作,稍候的單元才會深入介紹屬性及方法。


字串的特點是裡頭有個數不限的 Unicode 字元 (character) ,簡單講,一個字串就是一堆字元的集合體 (collection) ,像這樣內含多個數值集合體型態 (collection type) , Swift 中還有陣列 (array) 及字典 (dictionary) 。陣列的字面常數用中括弧,如下例


// array
var l = [1, 2, 3, 4, 5]
println(l[1])
l[1] = 78
println(l[1])

變數 l 是陣列,所謂的陣列是指相同資料型態數值的集合體,每一個數值被稱為陣列的元素 (element) ,可以用從 0 開始的索引值 (index) 存取或更改陣列的元素值,如上例陣列 l 用中括弧建立初值,中括弧裡用逗點分開的每一個數字都是 l 的元素,依序 1 的索引值為 02 的索引值為 1 ,餘下類推。


數字 1 跟字母 l 是不同的,自己寫程式最好避免單用 l 當變數,這裡僅作示範用。

之後都要用中括弧加索引值來存取或更改元素。陣列的索引預設為整數,字典則允許我們自訂索引值,如下例


// dictionary
var m = ["1":"a", "2":"yes", "3":"no"]
println(m["3"])
m["3"] = "we"
println(m)
m["3"] = nil
println(m["3"])
m["3"] = "55"
m["4"] = "after"
println(m)
var n = [1:"2", 2:"5", 5:"34"]
println(n[5])

字典的字面常數同樣用中括弧,裡頭的元素則是用冒號區隔的 key:value 配對, key 就是存取 value 的索引,有一點需要注意的是單一字典裡所有 key 必須是相同型態, value 也必須是相同型態。


上例中還看到關鍵字 nilnil 表示什麼都不是,當變數或元素被重新設定為 nil 的時候,原本的值就消去,取而代之的是什麼都不是的 nil


將以上輸入到 Playground ,右邊結果的地方可以看到 Optional("no")Some "we" ,這是選擇型態 (optionals) ,由於 Swift 是型態安全語言 (type safe language) ,從集合體型態取出數值或型態轉換時都會先進行型態推斷 (type inference) ,因此會被當作選擇型態。


如果要把變數宣告為選擇型態,就要在型態名稱後加上問號,如下例


// optional
var o: Int? = 1
// nil
o = nil

須留意 Int? 的變數可以是 nil ,可是 Int 的變數不能被指派為 nil


以上我們介紹的型態都是有名型態 (named type) ,意思是這些型態都有固定的識別字名稱, Swift 中另有兩種語言內建的複合型態 (compound type) ,其中之一為序對 (tuple) ,如下例


// tuple
var p = (12, "error", 0.314)
println(p.1)
var q = (a:12, b:"error", c:0.314)
println(q.a)

序對的字面常數為小括弧,小括弧中以逗號區隔的每個項目都是序對的元素,直接用小數點存取元素,也可以替元素設定 key 值,這都沒有限制是否要相同型態了。


另一種複合型態為函數,稍候的單元才會介紹。

也可以用關鍵字 typealias 替型態名稱取別名 (alias) ,例如


typealias NewInt = UInt16
println(NewInt.max)

當進行 typealias 的宣告之後,就可以用 NewInt 代替原本的 UInt16 ,至於 max 則是 UInt16 的屬性,記錄 UInt16 的最大值。


以上程式碼逐一在 Playground 輸入,結果如下



我們在這個單元中多用 abc 等英文字母當變數名稱,變數是識別字的一種, Swift 裡識別字的命名有一定的規範,下個單元我們繼續討論變數命名規則。


中英文術語對照


變數variable
型態type
字元character
字串string
標準程式庫standard library
函數function
型態標記type annotation
識別字identifier
整數integer
關鍵字keyword
常數constant
字面常數literal
物件object
屬性property
方法method
字元character
集合體collection
集合體型態collection type
陣列array
字典dictionary
元素element
索引值index
選擇型態optionals
型態安全語言type safe language
型態推斷type inference
有名型態named type
複合型態compound type
序對tuple

沒有留言: