Skip to main content

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

字串可用 + 做串接;若要把 CharacterString 串接,需先將 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(...) 將多種型別(如 IntDoubleCharacter)轉為 String

let charX: Character = "x"
print(String(charX)) // "x"
print(String(110)) // "110"
print(String(Double.pi)) // "3.141592653589793"

特殊字元(Escape Sequences)

說明
\0Null 字元
\\反斜線
\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()