變數 (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 外,還有 Int16 、 Int32 、 Int64 及 Int8 ,數字表示的是位元數,像 Int8 的意思是說 Int8 的整數範圍僅限 8 位元的二進位數字,也就是 Int8 型態的變數或常數只能在 -127 到 128 之間。
Int8 之前若加上 U 變成 UInt8 ,這就是無正負號整數,範圍從 0 到 255 。
另外所謂的型態係指物件 (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 的索引值為 0 , 2 的索引值為 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 也必須是相同型態。
上例中還看到關鍵字 nil , nil 表示什麼都不是,當變數或元素被重新設定為 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 輸入,結果如下
我們在這個單元中多用 a 、 b 、 c 等英文字母當變數名稱,變數是識別字的一種, 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 |
沒有留言:
張貼留言