Swift 字符串(String)全解析(2025 版)
“String 是值类型、支持 Unicode、功能强大” —— 掌握 50+ 操作,写出 安全、优雅、国际化 的文本处理代码!
一、Swift 字符串核心特性
| 特性 | 说明 |
|---|---|
| 值类型 | 赋值时复制,线程安全 |
| Unicode 合规 | 支持 emoji、中文、组合字符 |
| 集合类型 | 可遍历字符、子串 |
| 桥接 Foundation | 与 NSString 无缝互操作 |
let s1 = "Swift"
var s2 = s1 // 复制!s2 修改不影响 s1
s2 += "!"
print(s1) // "Swift"
二、创建字符串
1. 字面量
let str = "Hello, Swift!"
let emoji = "I love Swift"
let empty = ""
let empty2 = String()
2. 多行字符串(""")
let poem = """
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
自动去除首尾换行,缩进以结束
"""为准
3. 特殊字符转义
| 转义 | 含义 |
|---|---|
\0 | 空字符 |
\\ | 反斜杠 |
\t | 制表符 |
\n | 换行 |
\" | 双引号 |
\' | 单引号 |
\u{2600} | Unicode 标量(晴天) |
let path = "C:\\Windows\\System32"
let quote = "孔子说:\"学而时习之\""
let sun = "\u{2600}"
三、字符串插值(Interpolation)
let name = "小明"
let age = 18
let greeting = "你好,\(name),今年 \(age) 岁"
let math = "2 + 2 = \(2 + 2)" // 支持表达式
高级:插值中可调用函数、属性
let url = "https://api.com/user/\(userID)"
let formatted = "得分:\(String(format: "%.2f", score))"
四、字符串是集合 —— 遍历
let str = "Swift"
// 遍历字符(Character)
for char in str {
print(char) // S w i f t
}
// 遍历 Unicode 标量
for scalar in str.unicodeScalars {
print(scalar.value) // 83 119 105 102 116
}
// 转成数组
let chars = Array(str) // ["S", "w", "i", "f", "t"]
五、常用属性与方法
| 操作 | 代码 | 说明 |
|---|---|---|
| 长度 | str.count | 字符数 |
| 为空 | str.isEmpty | 是否空字符串 |
| 前缀 | str.hasPrefix("Sw") | 是否以…开头 |
| 后缀 | str.hasSuffix(".swift") | 是否以…结尾 |
| 包含 | str.contains("if") | 是否包含子串 |
| 大写 | str.uppercased() | 转为大写 |
| 小写 | str.lowercased() | 转为小写 |
| 首字母大写 | str.capitalized | 每个词首字母大写 |
let file = "document.txt"
file.hasSuffix(".txt") // true
file.uppercased() // "DOCUMENT.TXT"
六、字符串比较
"swift" == "swift" // true(内容相等)
"Swift" < "swift" // true(字典序,区分大小写)
// 忽略大小写
"Swift".caseInsensitiveCompare("swift") == .orderedSame
值类型:
==比较内容,不是引用
七、子串(Substring)—— 高效切片
let str = "Hello, Swift!"
let index = str.firstIndex(of: ",")!
let greeting = str[..<index] // "Hello"
let language = str[str.index(after: index)...] // ", Swift!"
// Substring → String
let langStr = String(language)
注意:
Substring共享原字符串内存,适合临时使用
八、字符串修改(var)
var str = "Hello"
// 追加
str += ", World!"
str.append("!")
str.append(contentsOf: "123")
// 插入
str.insert("X", at: str.startIndex)
str.insert(contentsOf: "abc", at: str.endIndex)
// 删除
str.remove(at: str.startIndex) // 删除第一个
str.removeSubrange(str.startIndex..<str.index(after: str.startIndex)) // 删除前1个
// 替换
str.replaceSubrange(str.startIndex..<str.index(str.startIndex, offsetBy: 5), with: "Hi")
九、字符串分割与拼接
分割
let csv = "张三,18,男"
let parts = csv.split(separator: ",") // ["张三", "18", "男"]
let trimmed = parts.map { $0.trimmingCharacters(in: .whitespaces) }
拼接
let words = ["Swift", "is", "awesome"]
let sentence = words.joined(separator: " ") // "Swift is awesome"
let csvLine = ["小明", "20", "男"].joined(separator: ",") // "小明,20,男"
十、正则表达式(Regex)—— Swift 5.7+
// 匹配邮箱
let emailRegex = /\w+@\w+\.\w+/
if "user@example.com" ~= emailRegex {
print("有效邮箱")
}
// 提取匹配
let pattern = /(\w+)@(\w+)\.(\w+)/
if let match = "user@example.com".firstMatch(of: pattern) {
print(match.1) // user
print(match.2) // example
}
十一、国际化与本地化
// 格式化数字
let price = 99.99
let formatted = String(format: "¥%.2f", price) // ¥99.99
// 本地化字符串
let localized = NSLocalizedString("welcome", comment: "欢迎语")
十二、字符串与 Foundation 互操作
import Foundation
let ns = "hello" as NSString
let swift = ns as String
// Foundation 方法
ns.components(separatedBy: " ")
ns.contains("ell")
ns.replacingOccurrences(of: "l", with: "*")
十三、性能优化技巧
| 场景 | 推荐做法 |
|---|---|
| 频繁拼接 | 用 String 的 append 或 += |
| 大量拼接 | 用 String + reserveCapacity |
| 临时子串 | 用 Substring,最后转 String |
| 重复字符串 | String(repeating:count:) |
var result = ""
result.reserveCapacity(1000) // 预分配
for i in 1...1000 {
result += "\(i)"
}
十四、实战项目:简易 CSV 解析器
func parseCSV(_ text: String) -> [[String]] {
return text
.split(separator: "\n")
.map { line in
line.split(separator: ",")
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.map { $0.replacingOccurrences(of: "\"", with: "") }
}
}
// 测试
let csv = """
"name","age","city"
"张三",18,"北京"
"李四",25,"上海"
"""
let data = parseCSV(csv)
print(data[1][0]) // 张三
十五、字符串速查表
| 操作 | 代码 |
|---|---|
| 长度 | s.count |
| 判空 | s.isEmpty |
| 拼接 | s + t 或 s += t |
| 插值 | "\(value)" |
| 子串 | s[..<i] |
| 替换 | s.replacingOccurrences(of:with:) |
| 分割 | s.split(separator:) |
| 连接 | array.joined(separator:) |
| 大小写 | s.uppercased() |
| 包含 | s.contains("x") |
| 前缀 | s.hasPrefix("x") |
| 正则 | s ~= /\d+/ |
十六、练习题(当场写!)
// 1. 反转字符串(不使用 reversed())
func reverse(_ s: String) -> String {
// 你的代码
}
// 2. 统计字符串中每个字符出现次数
func charFrequency(_ s: String) -> [Character: Int] {
// 你的代码
}
// 3. 判断是否回文(忽略大小写和空格)
func isPalindrome(_ s: String) -> Bool {
// 你的代码
}
答案(展开查看)
点击查看答案
// 1.
func reverse(_ s: String) -> String {
return String(s.reduce(into: []) { $0.insert($1, at: 0) })
// 或
// return String(s.characters.reverse())
}
// 2.
func charFrequency(_ s: String) -> [Character: Int] {
var freq: [Character: Int] = [:]
for c in s {
freq[c, default: 0] += 1
}
return freq
}
// 3.
func isPalindrome(_ s: String) -> Bool {
let cleaned = s.lowercased().filter { $0.isLetter || $0.isNumber }
return cleaned == String(cleaned.reversed())
}
总结:字符串黄金法则
| 法则 | 说明 |
|---|---|
1. 优先用 String 插值 | 比 + 更清晰 |
2. 多行用 """ | 避免转义地狱 |
3. 子串用 Substring | 节省内存 |
4. 频繁操作用 var + reserveCapacity | 高性能 |
| 5. 正则用 Regex | 简洁强大 |
6. 国际化用 NSLocalizedString | 支持多语言 |
你已完全掌握 Swift 字符串!
回复关键词继续学习:
Swift 字符串插值进阶Swift 正则表达式实战Swift 文本处理算法SwiftUI Text 渲染原理
现在就写一个函数:输入 "hello world" → 输出 "Hello World"(首字母大写)!