iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Mobile Development

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

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

  • 分享至 

  • xImage
  •  

昨天我們學會了如何運用 Swift 的各種運算子來進行計算和判斷。今天,我們要來深入探索一個在 Day 2 已經打過照面的老朋友:文字。

當時我們對 字串(String)字元(Character) 建立了基本認識,但它們的能耐遠不止於此!今天透過這篇教學文章,我們來學習更實用的操作方式,讓你未來能輕鬆應對各種文字處理的需求。

今日學習重點

  • 學習字串與字元的差別,以及如何宣告多行與空字串。
  • 掌握可變性,並活用拼接與插值技巧。
  • 學會遍歷字串中的每個字元,並使用特殊符號與 Unicode。
  • 探索如何計算字串長度與比較內容。

字元 vs. 字串

  • 字元(Character) 是單一的文字單位,例如 "A""7""!"
  • 字串(String) 是多個字元的集合,例如 "Hello, Swift!"
    兩者都使用雙引號 " 包起來,但字元需要明確宣告型別:
let myCharacter: Character = "A" // 這是一個字元
let myString: String = "Hello, Swift!" // 這是一個字串

建立字串的方式

字串字面量(String Literal)

最常見的方式是直接用雙引號包住文字:

let greeting = "Hello World!" // 將字串字面量指派給常數
var userName = "Melodia"  // 將字串字面量指派給變數

多行字串字面量(Multi-line String Literal)

當文字跨多行時,用三個雙引號 """ 包起來:

let longPoem = """
夜空中最亮的星,
能否聽清,
那遠方的聲音,
為我指引。
"""
print(longPoem)

初始化空字串

var emptyString1 = ""             // 直接指派空的字串字面量
var emptyString2 = String()       // 使用 String 類型的初始化器

這兩種寫法都可以創建一個沒有任何內容的空字串,效果是完全一樣的,可以依照自己的程式撰寫習慣來選擇其中一種寫法。

字串的可變性 (String Mutability)

就像其他資料型別,字串的可變性也由 varlet 決定。
這會直接影響你是否能修改字串的內容,例如追加文字。

  • var 宣告的字串是可變的 (mutable)。
  • let 宣告的字串是不可變的 (immutable)。
var variableString = "蘋果"
variableString += "和香蕉" // 沒問題,因為是 var
print(variableString)      // 印出 蘋果和香蕉

let constantString = "橘子"
// constantString += "和檸檬" // 這行會直接報錯!因為 let 宣告的字串無法修改

操作字元:字串是字元的集合

字串本質上是有序的字元序列,可以用 for-in 逐字元遍歷:

for character in "Swift!" {
    print(character)
}
// 印出結果:
// S
// w
// i
// f
// t
// !

拼接字串:文字的連接術

使用 ++= 連接字串或字元:

let part1 = "Hello "
let part2 = "World"
let wholeString = part1 + part2 + "!" // 使用 + 拼接多個字串
print(wholeString) // 印出:Hello World!

var part3 = "今天天氣"
part3 += "真好。" // 使用 += 追加內容
print(part3) // 印出:今天天氣真好。

字串插值:動態生成文字

字串插值能把變數、常數或運算結果直接嵌入字串,這個用法在前面文章有稍微提過:

let name = "Amy"
let age = 25
let message = "我的名字是 \(name),我今年 \(age) 歲。"
print(message) // 印出:我的名字是 Amy,我今年 25 歲。

一個很方便的用法,直接在裡面進行運算:

let price = 100
let quantity = 3
print("總價是:\(price * quantity) 元。") // 印出:總價是:300 元。

字串中的特殊符號

有時候,你需要在字串中表示一些特殊意義的字元,例如換行、Tab 鍵,或是雙引號本身。這時候就需要用到跳脫字元和 Unicode 純量。

跳脫字元 含義    
\n 換行    
\t 水平 Tab
\" 雙引號    
\\ 反斜線    
\r 回車    
\0 空字元    

\":在字串中插入雙引號:

let quote = "他說: \"你好嗎?\""
print(quote) // 印出:他說: "你好嗎?"

\\:代表一個反斜線:

let filePath = "C:\\Users\\Desktop\\file.txt"
print(filePath) // 印出:C:\Users\Desktop\file.txt

\u{n} 表示 Unicode 字元,n 是十六進制碼:

let heart = "\u{2764}"
print("我愛 Swift \(heart)") // 印出:我愛 Swift ❤️

let koreanCharacter = "\u{D55C}"  // 韓文「한」的 Unicode 編碼
print("這是韓文字:\(koreanCharacter)")  // 印出:這是韓文字:한

順帶一提!其實 Swift 的 .count 比你想像的更聰明!

Swift 的 .count 計算的是人類眼中「可見字元」的數量(又稱 字形叢集 Grapheme Cluster),而不是電腦底層的編碼數量。這讓它在處理 Emoji 和多國語言時表現更好。

let simpleEmoji = "❤️"
print(simpleEmoji.count) // 印出:1
let familyEmoji = "👨‍👩‍👧‍👦" // 這其實是由多個 Unicode 符號組合而成
print(familyEmoji.count) // 仍然印出:1

無論一個 Emoji 多複雜,Swift 都會將它視為一個單一字元來計算,這完全符合我們的直覺!

計算字串中的字元數量

.count 屬性:

let myText = "鐵人賽加油!"
print("這個字串有 \(myText.count) 個字元。") // 印出:這個字串有 6 個字元。

比較字串:判斷文字關係

==!= 判斷是否相同:

let strA = "Apple"
let strB = "Apple"
let strC = "Banana"

if strA == strB {
    print("strA 和 strB 內容相同。") // 會印出
}

if strA != strC {
    print("strA 和 strC 內容不同。") // 會印出
}

檢查前綴 .hasPrefix(): 判斷字串是否以指定的文字開頭:

let sentence = "今天天氣很好。"

if sentence.hasPrefix("今天") {
    print("這句話是從『今天』開始的") // 會印出
}

檢查後綴 .hasSuffix(): 判斷字串是否以指定的文字結尾:

let fileName = "document.pdf"

if fileName.hasSuffix(".pdf") {
    print("這是 PDF 檔案") // 會印出
}

小結一下

今天我們對 Swift 的文字處理能力進行了一次全面的升級!從區分字元與字串、建立多樣化的字串開始,我們打下了撰寫程式的基礎。

接著,我們掌握了修改與組合文字的核心技巧,不僅理解 varlet 帶來的可變性差異,也熟練了字串拼接與插值的運用。我們還學會了如何遍歷字元、使用 Unicode 與特殊符號,並透過 .count.hasPrefix()等方法來計算與比較字串。

🌟 明天預告

想像一下,如果想用程式做一個「待辦事項」或「購物清單」,只靠我們目前學過的變數是辦不到的。我們需要一個能裝下一整排資料的容器!

明天,我們就要來認識 Swift 中最強大、也最常用的集合型別:陣列 (Array)。你將學會如何建立一個清單、隨時新增或刪除項目、並透過編號精準地取出任何一筆資料。這是管理大量有序資料的必備神技!

敬請期待《Day 6|Swift 陣列全攻略:有序資料的必備管理術!》


上一篇
Day 4|Swift 運算子全攻略:從加減乘除到邏輯推理,寫程式就像解題!
下一篇
Day 6|Swift 陣列全攻略:有序資料的必備管理術!
系列文
Swift iOS 開發新手村:從入門到 AI 聊天室6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言