alanchan

Swift初學者筆記3──變數和運算符

 (編輯過)
變數和常數的類型、建立和使用,運算符的種類,邏輯運算

程式編寫的「變數(variable)」和「常數(constant)」其實跟數學的代數概念相當相似,都是以一些代號去代表一個數值,從而也可以代表其他東西,例如「物件(object)」和「功能(function)」。

Swift接受統一碼(萬國碼(Unicode))的變數名稱(辨識碼(identifier)),像是中文和表情符號(emoji)也可以用作變數名稱,但不接受空格、數學符號(數學中常見的希獵字母沒問題)、使用者定義字元、箭頭和方框繪製字元(像┴、╣、█、▒ 這些)。數字可以用但不能用作開頭,即lifetaker_3000可以,但3000_lifetaker不行。

要建立一個變數或常數可使用關鍵字var和let

let weapon = "Lifetaker"  // 用let建立了常數weapon,這個常數的值為字串"Lifetaker"
var version = 3000        // 用var建立了變數version,這個變數的值為整數3000

上面的例字中我們沒有指明常數或變數的類型,Swift會根據等號右邊的值作「型別推斷(type inference)」,選擇合適的類型。我們也可以指定類型,例如要儲存不長(精度不用太高)的實數(小數)的話我們可以指明選用32位元的Float作為變數的類型,如果沒有指明的話Swift會選用64位元的Double

var n: Float = 123.45

常數let和變數var的化分別在於常數定義後就不能更改,變數則可以

var 🐶 = 101
print(🐶)
🐶 = 🐶 + 1
print(🐶)
101
102

在很多情況下兩者的語法都相同,下文開始只說變數以作簡化

一些基本的變數類型為:

var i: Int = -100                 // 整數,32位元或64位元,視乎系統
var u: UInt = 2554294967295       // 不包含負數的整數
var f: Float = 3.141592           // 小數,32位元
var d: Double = 3.14159265358979  // 小數,64位元
var s: String = "Hello"           // 字串
var c: Character = "c"            // 單一字符
var b: Bool = true                // 一個只有真(true)和假(false)兩個可能值的類型,全寫是Boolean(布林),以發明者George Boole(佐治・布爾)名命

數字間可以加入底線方便閱讀,例如

print(1000000==1_000_000)

結果是

true

還有指定位元的Int和UInt,分別有8, 16, 32, 64,例如Int8是8位元整數,範圍是-128至127,UInt是不包含負數的事位元整數,範圍是0至255 。Float也有Float32, Float64和Float80。

注意整數相除只會得出整數部份,例如

var x = 10
var y = 3
print(x / y)
print(5 / 2)

結果是

3
2

如果想結果包括小數部份,則要把變數轉換為小數。如果所有運算值都是數字不包含變數的話只要是有一個是小數就可以了。

print(Double(x) / Double(y))  // 要每個都轉換
// print(Double(x) / y)       // 只轉一個不行,不同類型的變數不可以一起運算
print(Double(x) / Float64(y)) // 這個可以,Double等於Float64,Float也等於Float32
// print(x / Int64(y))  // 但Int既不等於Int64,也不等於Int32
print(5 / 2.0)          // 單純數字有一個是小數就可以了
print(5 / 2 + 0.0)      // 這樣也行!

如果我們想建立一個變數但未有實際數值要變數儲存,則建立變數時必需指明變數類型。

var i = 100  // OK
var j: Int   // OK
var k        // 不行

運算符

其實我們已經見過幾個「運算符(operator)」了以

x = 1 + 2

為例,等號右邊1 + 2的+就是運算符,1和2則叫「運算元(operand)(也叫運算數)」,1是左運算元,2是右運算元。

然後把範圍拉闊到整個語句(statement)(也叫敍述式),1 + 2則是作為右運算元的一個「表達式(expression)」,=是運算符,x則是左運算元

這些關係到兩個運算元的運算符稱為二元運算符,常用的包括:

// 等號「=」叫「賦值運算符(assignment operator)(或指定運算符)」,用作指定等號右邊的值給等號左邊的變數儲存。

// 算術運算符(arithmetic operator)
var a = 3        // 建立變數a,並指定3這個數值給a
var b = a + 2    // 建立變數b,並指定a + 2這個表達式的結果,即5,給b
var c = b        // 建立變數c,並指定b的值,即5,給c

// + - * / % 都可以跟=組成「複合(賦值)運算符(compound (assignment) operator」
c -= a             // 這語句可理解為c = c - a,所以c的值變成了2
var d = a * c      // 建立變數d,並指定a乘以c的結果,即6,給d
d /= 1 + 1         // d = d / (1 + 1),d = 6 / 2,d = 1
var e = 100 % a    // %在算式中是找餘數的符號,e = 100 % 3,100 / 3 = 33...1,e = 1
// %作為運算符時,常見的叫法是modulus operator,remainder operator

// 關係運算符(relational operator),乘上敍述,a = 3,b = 5
a == 3      // a是否等於3?結果是布林值的true
b != 5      // b是不不等於5?結果是false
b > a       // b是否大於a?結果是true
b < a       // b是否小於a?結果是false
a >= 3      // 3是不大於或等3?結果是true
b <= a      // b是不小於或等於a?結果是false
// 還有===是比較兩個變數是不是指向同一個物件,暫不詳述

// 邏輯運算符(logical operator)
!(a == 3)              // NOT operator,這是兩個=,一個=是用於賦值,兩個=才是比較。!(a == 3)即是非(a == 3),a == 3是true,非a == 3即非true,結果是false
1 + 1 == 2 && a > b    // AND operator,兩邊都是true結果才會是true。由於a不大於b,結果是false
1 + 1 == 2 || a > b    // OR operator,其中一邊是true便會是true。1 + 1等於2,結果是true

通常敍述式的次序是由左向右看,但運算符有不同優先度,例如b = a + 2便是先把a + 2算好才指定結果給b,可見+的運算優先於=。邏輯運算符的運算次序是! > && > ||。即,先算!,再算&&,然後才算||。

true || !false && false   // 中間的非false即是true,所以等於下一行
true || true && false    // ||和&&要先看&&,true&&false是false,所以等於下行
true || false        // 結果是true

我們也可以加入括弧指明優先次序,用上面的例子,只要加上一對括弧便會改變結果

(true || !false) && false    //先看括弧裏的true || !false,是true,所以等於下一行
true && false                //結果是false

也可以用!反轉括弧內容得出的結果,而括弧可以不止一層,次序是由最裏面的括弧算起。

true && !((true || !false) && false)  // 先看最裏面的括弧內,true || !false是true
true && !(true && false)        // 先看括弧,true && false是false
true && !false             // !false是true
true && true              // 結果是true

喜歡我的文章嗎?
別忘了給點支持與讚賞,讓我知道創作的路上有你陪伴。

CC BY-NC-ND 2.0 版權聲明

Swift初學者筆記2──Hello world

看不過癮?

一鍵登入,即可加入全球最優質中文創作社區