iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Mobile Development

Swift iOS 開發新手村:從入門到 AI 聊天室系列 第 4

Day 4|Swift 運算子全攻略:從加減乘除到邏輯推理,寫程式就像解題!

  • 分享至 

  • xImage
  •  

昨天,我們學會了處理「可能不存在」的資料,讓程式在對話時不再輕易出錯。今天,我們要為這門「程式語言」增添更多的邏輯概念!

我們要學習的就是 運算子(Operators)。它們是程式世界中的運算符號 (+, *)、比較詞 (>, ==) 與連接詞 (&&, ||),賦予我們組合與判斷的能力。學會它們,你就能從簡單的對話,進階到能清晰表達複雜的程式邏輯。

今日學習重點

  • 基本運算:學習加減乘除 (+, -, *, /) 與賦值 (=, +=)。
  • 條件判斷:掌握比較 (==, >) 與邏輯 (&&, ||),建立判斷依據。
  • Swift 特色運算子:探索區間 (...)、三元 (?:) 與空值聚合 (??) 等高效率語法。
  • 運算順序:了解括號 (()) 如何決定計算的先後順序。

指派運算子

Swift 使用 = 來將某個值「指派」給變數或常數:

let b = 10
var a = 5
a = b
// a 等於 10

也可以一次指派多個值:

let (x, y) = (1, 2)
// x 為 1, y 為 2

數值運算子

Swift 支援基本的四則運算:

var c = 1 + 2     // c 等於 3
var d = 7 - 2     // d 等於 5
var e = 3 * 2     // e 等於 6
var f = 10.0 / 2.5 // f 等於 4.0

加法 + 也能用來串接字串:

let str1 = "Hello, "
let str2 = "Swift"
let str3 = str1 + str2
print(str3)  // 印出:Hello, Swift

餘數運算(%)

餘數是「除不盡的部分」,也稱為取模(mod)運算:

var oneNumber = 9 % 4
print(oneNumber) // 餘數為 1,因為 9 = 4 * 2 + 1

一元正負號

你可以用 - 切換正負號,或用 + 保持原值:

let number1 = 3
var negative = -number1       // -3
var backToPositive = -negative // 3

let number2 = -6
var unchanged = +number2      // -6

+ 號存在的意義是什麼?

看到這裡你可能想問:如果 +number2number2 結果一樣,為什麼 + 還要存在?

  1. 語法對稱性:主要是為了與負號 - 形成對稱,讓語言的語法更完整。
  2. 提升可讀性:在需要對齊正負數時,+ 能讓排版更整齊,正負關係一目了然,就像這樣:
// 使用 + 號對齊後,正負關係非常清晰
let profit  = +1000
let cost    = -350
let tax     = -150
let bonus   = +200

在日常開發中,基本上不太需要使用一元正號 +,但了解它存在的理由跟概念,有助於你閱讀他人的程式碼。

複合指派運算子

Swift 提供把數值運算與指派合併的簡潔寫法:

var n = 3
n += 2  // n = n + 2 = 5
n -= 1  // n = n - 1 = 4
n *= 2  // n = n * 2 = 8
n /= 4  // n = n / 4 = 2
n %= 2  // n = n % 2 = 0

比較運算子

比較運算子會傳回一個布林值(truefalse):

運算子 意義
== 等於
!= 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於
1 == 1  // true
2 != 1  // true
2 > 1   // true
1 < 2   // true
1 >= 1  // true
2 <= 1  // false

你也可以搭配 if 使用:

var i = 1
if i == 1 {
    print("Yes, it is 1.")
} else {
    print("No, it is not 1.")
}

元組比較

當元組中的所有成員本身都支援比較時,Swift 也允許你直接比較整個元組。
它的比較方式非常直觀,就跟你查字典時比較單字的順序一模一樣,我們稱之為 字典序比較 (lexicographical comparison)

規則如下:

  1. Swift 會從元組的第一個元素開始比較。
  2. 如果這兩個元素不相等,那整個比較就立刻結束,並以這對元素的比較結果作為最終結果。
  3. 如果第一個元素相等,Swift 就會接著比較第二個元素,以此類推。
  4. 對於 == 的比較,則要求所有對應的元素都必須相等。

我們來看一下範例,一步步拆解 Swift 的思考邏輯:

(1, "zebra") < (2, "apple")  // true

Swift 只比較了第一個元素 1 和 2。因為 1 < 2 成立,比較立刻停止,直接回傳 true。它根本不會去看後面的 "zebra""apple"

(3, "apple") < (3, "bird")  // true

Swift 比較第一個元素 3 和 3,發現它們相等,於是接著比較第二個元素。因為 "apple" 在字典順序中排在 "bird" 前面 ("a" < "b"),所以 "apple" < "bird" 成立,最終回傳 true

(4, "dog") == (4, "dog")  // true

對於 == 比較,Swift 會檢查所有對應的元素是否都相等。因為 4 == 4 而且 "dog" == "dog",所以回傳 true

三元運算子

有時候,我們的 if-else 邏輯非常簡單:如果條件成立,就賦予 A 值;如果不成立,就賦予 B 值。

未使用三元運算子之前,你可能會這樣寫:

let score = 85
var result: String

if score >= 60 {
    result = "及格"
} else {
    result = "不及格"
}
print(result) // 印出 "及格"

為了這種簡單情況,Swift 提供了一個更簡潔的語法——三元運算子,把上面 7 行的程式碼濃縮成 1 行!
使用三元運算子之後:

let score = 85
let result = score >= 60 ? "及格" : "不及格"
print(result) // 同樣印出 "及格"

它的語法結構是 條件 ? 值1 : 值2,概念是:

score >= 60 這個條件是真的嗎?(?)
如果是,就使用 值1 ("及格");
否則(:),就使用 值2 ("不及格")。

透過這種方式,程式碼變得更精煉,可讀性也相當高。

空值聚合運算子(??)

空值聚合運算子會檢查左邊的值是否為 nil,如果是,就返回右邊的預設值:

let defaultColor = "red"
var userColor: String? = nil
var colorToUse = userColor ?? defaultColor
print(colorToUse) // 印出 red

userColor = "green"
colorToUse = userColor ?? defaultColor
print(colorToUse) // 印出 green

區間運算子

Swift 提供三種區間寫法,常搭配 for-in 使用:

閉區間(a...b)

包含 ab

for i in 1...3 {
    print(i)
}
// 印出 1 2 3

半開區間(a..<b)

包含 a,但不包含 b

for i in 1..<4 {
    print(i)
}
// 印出 1 2 3

單側區間

只指定一邊的界限:

let names = ["Anna", "Alex", "Brian", "Jack"]

for name in names[2...] {
    print(name)  // Brian, Jack
}

for name in names[...1] {
    print(name)  // Anna, Alex
}

for name in names[..<2] {
    print(name)  // Anna, Alex
}

邏輯運算子

Swift 支援三種邏輯運算,搭配條件判斷使用:

  • !a 邏輯非
  • a && b 邏輯且
  • a || b 邏輯或

邏輯非:

let isOpen = false
if !isOpen {  // !false 等於 true,所以條件成立
    print("It is open.")  // 印出 It is open.
}

邏輯且:

let a = true
let b = false

if a && b {  // true && false 等於 false,條件不成立
    print("Success") // 這行不會執行
} else {
    print("Failure") // 印出 Failure
}

邏輯或:

let isSunday = true
let isWeekday = false

if isSunday || isWeekday {  // true || false 等於 true,條件成立
    print("Open") // 印出 Open
}

括號優先與運算順序

Swift 遵循運算子優先級規則。當運算式變複雜時,可以用括號來確保順序正確:

var number = 3 + 2 * 5      // 結果為 13
var another = (3 + 2) * 5   // 結果為 25

邏輯運算中也一樣:

let a = false
let b = true
let c = true

if a && b || c {
    print("Success")  // 成立,印出 Success
}

if a && (b || c) {
    print("Failure")  // 不成立,這行不會被執行
}

小結一下

今天我們全面攻略了 Swift 的運算子!我們從最基礎的數值運算與指派 (=, +=) 開始,接著掌握了建立判斷式不可或缺的比較與邏輯運算 (==, &&)。我們更探索了區間 (...)、三元 (?:) 與空值聚合 (??) 等能大幅簡化程式碼的 Swift 高效率語法。

熟練運用這些工具,並注意括號決定的運算順序,是寫出簡潔、清晰且強大程式碼的關鍵一步。

🌟 明天預告

在程式世界裡,文字無所不在。我們雖然已經認識了 字串(String),但它的能耐遠不止於此!

明天,我們將深入探索 Swift 中字串的更多強大功能,包括如何處理多行文字、如何遍歷字串中的每一個字元,以及各種超實用的內建方法(例如檢查字首、計算長度等)。讓你對文字的操作功力更上一層樓!

敬請期待《Day 5|Swift 字串進階指南:多行文字、字元遍歷與實用方法!》


上一篇
Day 3|Swift 可選型別全攻略:從安全解包到隱式解析,告別程式崩潰恐懼!
下一篇
Day 5|Swift 字串進階指南:多行文字、字元遍歷與實用方法!
系列文
Swift iOS 開發新手村:從入門到 AI 聊天室6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言