swift-string
Swift 字串與字元(String & Character)
Character(字元)
Character 是用來儲存單一 Unicode 標量值(scalar value)的型別,一個字元可能由一個或多個 Unicode code point 組成。
let aChar: Character = "A"
型別推斷(Type Inference)
Swift 會把由雙引號包住的常值預設推斷為 String。若要明確指定為 Character,必須用 Character 型別註記,且內容只能是一個字元。
let aString = "A"
let aChar: Character = "A"
print(type(of: aString)) // String
print(type(of: aChar)) // Character
// 下列程式碼會無法編譯(右側是多個字元,非單一字元)
// let badChar: Character = "Too many characters"
串接(Concatenation)與 append
字串可用 + 做串接;若要把 Character 與 String 串接,需先將 Character 轉成 String,或使用 append(_:)。
print("honey" + "comb") // "honeycomb"
var greeting = "Hello"
let world = ", world"
let period: Character = "."
greeting.append(world)
print(greeting) // "Hello, world"
greeting.append(period)
print(greeting) // "Hello, world."
字串插值(String Interpolation)
在字串中以 \(表達式) 插入變數或運算結果。
let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // The area of a circle with radius 5.0 is 78.53981633974483
常見屬性(String / Character Properties)
- String
isEmpty: 是否為空字串count: 字元數
let s = "Hello"
print(s.isEmpty) // false
print(s.count) // 5
- Character
isLowercase: 是否為小寫isUppercase: 是否為大寫isNumber: 是否為數字isWhitespace: 是否為空白字元
let a: Character = "a"
let A: Character = "A"
let one: Character = "1"
let space: Character = " "
print(a.isLowercase) // true
print(A.isUppercase) // true
print(one.isNumber) // true
print(space.isWhitespace) // true
型別轉換(To String)
可以使用 String(...) 將多種型別(如 Int、Double、Character)轉為 String。
let charX: Character = "x"
print(String(charX)) // "x"
print(String(110)) // "110"
print(String(Double.pi)) // "3.141592653589793"
特殊字元(Escape Sequences)
| 值 | 說明 |
|---|---|
\0 | Null 字元 |
\\ | 反斜線 |
\t | 水平定位(Tab) |
\n | 換行 |
\r | 歸位(Carriage return) |
\' | 單引號 |
\" | 雙引號 |
\u{FFFF} | 16 進位 Unicode 字元 |
let quote: String = "\"Hello\", he said."
print(quote) // "Hello", he said.
let unicode: Character = "\u{1F496}"
print(unicode) // 💖
在 Swift 裡,String 的字元存取要用 String.Index,不能直接用數字下標。
抓最後一個字的方法有幾種 👇
🔹 最簡單:last
let text = "Hello"
if let lastChar = text.last {
print(lastChar) // "o"
}
🔹 用 index(before:)
let text = "Hello"
let lastIndex = text.index(before: text.endIndex)
let lastChar = text[lastIndex]
print(lastChar) // "o"
🔹 如果要轉成 String
let text = "Hello"
if let lastChar = text.last {
let lastStr = String(lastChar)
print(lastStr) // "o"
}
這個情境很常見 👍 例如我們要抓字串最後一個字,但先做了 trim(去掉前後空白),結 果可能變成空字串,就要先判斷。
🔹 安全寫法
let raw = " " // 全部都是空白
let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines)
if let lastChar = trimmed.last {
print("最後一個字是:\(lastChar)")
} else {
print("字串是空的,沒有最後一個字")
}
🔹 包裝成小函式
func lastCharacter(afterTrimming text: String) -> String? {
let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines)
return trimmed.last.map { String($0) }
}
// 測試
print(lastCharacter(afterTrimming: " Hello ")) // "o"
print(lastCharacter(afterTrimming: " ")) // nil
這樣就不用怕 trim 後變空字串,會安全地回傳 nil。
要不要我幫你做成 String 的 extension,讓你可以直接寫 text.trimmedLastCharacter()?