Swift 字符串详解:从基础到实战
1. 引言字符串是 Swift 开发中使用频率最高的数据类型之一。无论是处理用户输入、解析网络数据还是拼接展示文本都离不开字符串操作。Swift 的字符串在设计上兼顾了安全性与性能同时也引入了一些与其他语言不同的特性例如字符与字节的区分、多行字符串字面量、以及强大的字符串插值能力。本文将通过丰富的代码实例系统讲解 Swift 字符串的核心概念与常用操作。2. 字符串基础2.1 字符串字面量在 Swift 中字符串字面量使用双引号包裹。字符串类型为String它是值类型在赋值或传递时会进行拷贝。let greeting Hello, Swift var message Welcome to Swift print(greeting) // 输出: Hello, Swift print(message) // 输出: Welcome to Swift2.2 多行字符串当字符串内容包含换行时可以使用三引号创建多行字符串字面量。let poem 床前明月光 疑是地上霜。 举头望明月 低头思故乡。 print(poem)多行字符串的缩进以结尾三引号的位置为基准Swift 会自动去除多余的公共缩进。2.3 字符串插值字符串插值允许在字符串中嵌入变量、常量或表达式使用反斜杠加括号的语法。let name Alice let age 25 let score 92.5 let intro 我叫 \(name)今年 \(age) 岁考试得分 \(score) 分。 print(intro) // 输出: 我叫 Alice今年 25 岁考试得分 92.5 分。 // 插值中可以使用表达式 let sum 3 5 \(3 5) print(sum) // 输出: 3 5 83. 字符串的创建与转换3.1 空字符串var empty1 var empty2 String() if empty1.isEmpty { print(empty1 是空字符串) } if empty2.isEmpty { print(empty2 也是空字符串) }3.2 从其他类型转换let intValue 42 let strFromInt String(intValue) print(strFromInt) // 输出: 42 let doubleValue 3.14 let strFromDouble String(doubleValue) print(strFromDouble) // 输出: 3.14 let boolValue true let strFromBool String(boolValue) print(strFromBool) // 输出: true // 使用描述性转换 let custom String(describing: 100) print(custom) // 输出: 1003.3 字符串与字符数组互转let text Swift let chars: [Character] Array(text) print(chars) // 输出: [S, w, i, f, t] let backToString String(chars) print(backToString) // 输出: Swift4. 字符串的遍历与索引4.1 遍历字符let word Swift for char in word { print(char) } // 输出: // S // w // i // f // t4.2 使用索引访问字符Swift 字符串不能直接使用整数下标访问字符因为不同字符可能占用不同数量的字节。必须使用String.Index类型。let str Hello, Swift // 获取起始索引 let startIndex str.startIndex let firstChar str[startIndex] print(firstChar) // 输出: H // 获取偏移后的索引 let secondIndex str.index(startIndex, offsetBy: 1) let secondChar str[secondIndex] print(secondChar) // 输出: e // 获取末尾索引 let endIndex str.index(before: str.endIndex) let lastChar str[endIndex] print(lastChar) // 输出: t // 使用偏移量获取中间字符 let midIndex str.index(startIndex, offsetBy: 7) print(str[midIndex]) // 输出: S4.3 安全访问字符extension String { func safeChar(at offset: Int) - Character? { guard offset 0, offset count else { return nil } let index self.index(startIndex, offsetBy: offset) return self[index] } } let demo Swift if let c demo.safeChar(at: 2) { print(c) // 输出: i } if let c demo.safeChar(at: 10) { print(c) } else { print(索引越界返回 nil) }5. 字符串的拼接与修改5.1 拼接字符串var str1 Hello var str2 World // 使用加号拼接 let combined str1 , str2 print(combined) // 输出: Hello, World // 使用 append 方法 str1.append(!) print(str1) // 输出: Hello! // 使用 append 添加字符 var str3 Swift str3.append(Character(!)) print(str3) // 输出: Swift!5.2 插入与删除var text Hello World // 在指定位置插入字符 let insertIndex text.index(text.startIndex, offsetBy: 5) text.insert(,, at: insertIndex) print(text) // 输出: Hello, World // 在指定位置插入字符串 let spaceIndex text.index(text.startIndex, offsetBy: 6) text.insert(contentsOf: Swift, at: spaceIndex) print(text) // 输出: Hello, Swift World // 删除指定位置的字符 let removeIndex text.index(text.startIndex, offsetBy: 5) text.remove(at: removeIndex) print(text) // 输出: Hello Swift World // 删除范围内的字符 let rangeStart text.index(text.startIndex, offsetBy: 6) let rangeEnd text.index(text.startIndex, offsetBy: 11) text.removeSubrange(rangeStart..rangeEnd) print(text) // 输出: Hello World5.3 替换子串var sentence I love Python if let range sentence.range(of: Python) { sentence.replaceSubrange(range, with: Swift) } print(sentence) // 输出: I love Swift // 使用 replacingOccurrences 批量替换 let original apple, banana, apple let replaced original.replacingOccurrences(of: apple, with: orange) print(replaced) // 输出: orange, banana, orange6. 字符串的查找与判断6.1 判断前缀与后缀let filename report_2026.pdf print(filename.hasPrefix(report)) // 输出: true print(filename.hasPrefix(Report)) // 输出: false区分大小写 print(filename.hasSuffix(.pdf)) // 输出: true print(filename.hasSuffix(.txt)) // 输出: false6.2 查找子串位置let content Swift is a powerful language. Swift is also fun. if let range content.range(of: powerful) { let start content.distance(from: content.startIndex, to: range.lowerBound) print(找到子串起始位置: \(start)) // 输出: 找到子串起始位置: 10 } // 查找所有匹配位置 var searchStart content.startIndex while let range content.range(of: Swift, range: searchStart..content.endIndex) { let pos content.distance(from: content.startIndex, to: range.lowerBound) print(Swift 出现在位置: \(pos)) searchStart range.upperBound } // 输出: // Swift 出现在位置: 0 // Swift 出现在位置: 296.3 包含判断let email userexample.com if email.contains() { print(包含 符号) } if email.contains(example) { print(包含 example) } // 不区分大小写的包含判断 let lower email.lowercased() if lower.contains(EXAMPLE.lowercased()) { print(不区分大小写匹配成功) }7. 字符串的大小写与修剪7.1 大小写转换let mixed Hello Swift print(mixed.uppercased()) // 输出: HELLO SWIFT print(mixed.lowercased()) // 输出: hello swift print(mixed.capitalized) // 输出: Hello Swift7.2 去除空白字符let padded Swift Programming // 去除首尾空白 let trimmed padded.trimmingCharacters(in: .whitespacesAndNewlines) print(\(trimmed)) // 输出: Swift Programming // 去除指定字符集 let symbols ---Hello--- let cleaned symbols.trimmingCharacters(in: CharacterSet(charactersIn: -)) print(cleaned) // 输出: Hello8. 字符串分割与合并8.1 按分隔符分割let csv apple,banana,orange,grape let fruits csv.split(separator: ,) print(fruits) // 输出: [apple, banana, orange, grape] // split 返回 Substring 数组可转换为 String let fruitStrings csv.split(separator: ,).map { String($0) } print(fruitStrings) // 输出: [apple, banana, orange, grape] // 按多个字符分割 let sentence Hello-World_Swift let parts sentence.components(separatedBy: CharacterSet(charactersIn: -_)) print(parts) // 输出: [Hello, World, Swift]8.2 合并字符串数组let words [Swift, is, awesome] let joined words.joined(separator: ) print(joined) // 输出: Swift is awesome let numbers [1, 2, 3] let csvLine numbers.joined(separator: ,) print(csvLine) // 输出: 1,2,39. 字符串比较9.1 相等性比较let a Swift let b Swift let c swift print(a b) // 输出: true print(a c) // 输出: false区分大小写 print(a ! c) // 输出: true9.2 字典序比较let x apple let y banana print(x y) // 输出: trueapple 在 banana 之前 print(y x) // 输出: true print(x x) // 输出: true9.3 前缀与后缀比较let url https://www.example.com if url.hasPrefix(https://) { print(这是一个 HTTPS 链接) } if url.hasSuffix(.com) { print(这是一个 .com 域名) }10. 字符串与数字的转换10.1 字符串转数字let numStr 123 if let num Int(numStr) { print(转换成功: \(num)) // 输出: 转换成功: 123 } let doubleStr 3.14 if let pi Double(doubleStr) { print(转换成功: \(pi)) // 输出: 转换成功: 3.14 } // 转换失败返回 nil let invalid abc if let value Int(invalid) { print(value) } else { print(转换失败返回 nil) }10.2 格式化数字为字符串let price 19.99 let priceStr String(format: %.2f, price) print(priceStr) // 输出: 19.99 let percent 0.856 let percentStr String(format: %.1f%%, percent * 100) print(percentStr) // 输出: 85.6%11. 实战案例简易日志格式化器下面综合运用字符串的拼接、插值、时间格式化等知识实现一个简易的日志格式化器。import Foundation enum LogLevel: String { case info INFO case warning WARNING case error ERROR } struct Logger { static func format(level: LogLevel, message: String, file: String #file, line: Int #line) - String { let timestamp Date() let formatter DateFormatter() formatter.dateFormat yyyy-MM-dd HH:mm:ss let timeStr formatter.string(from: timestamp) let fileName (file as NSString).lastPathComponent return [\(timeStr)] [\(level.rawValue)] [\(fileName):\(line)] \(message) } } // 使用示例 let log1 Logger.format(level: .info, message: 应用启动成功) print(log1) // 输出示例: [2026-08-06 08:35:01] [INFO] [main.swift:24] 应用启动成功 let log2 Logger.format(level: .error, message: 网络请求失败) print(log2) // 输出示例: [2026-08-06 08:35:01] [ERROR] [main.swift:27] 网络请求失败12. 实战案例文本统计工具实现一个统计文本中单词数量、字符数量和出现频率的小工具。import Foundation func analyzeText(_ text: String) { // 统计字符数 let charCount text.count print(字符总数: \(charCount)) // 按空白分割统计单词数 let words text.split(whereSeparator: { $0.isWhitespace || $0.isPunctuation }) print(单词总数: \(words.count)) // 统计每个单词出现频率 var frequency: [String: Int] [:] for word in words { let lower word.lowercased() frequency[lower, default: 0] 1 } // 按频率排序输出前 5 个高频词 let sorted frequency.sorted { $0.value $1.value } print(高频词汇 Top 5:) for (word, count) in sorted.prefix(5) { print( \(word): \(count) 次) } } let sample Swift is powerful. Swift is safe. Swift is fast. Love Swift! analyzeText(sample) // 输出示例: // 字符总数: 55 // 单词总数: 10 // 高频词汇 Top 5: // swift: 4 次 // is: 3 次 // powerful: 1 次 // safe: 1 次 // fast: 1 次13. 总结本文系统介绍了 Swift 字符串的核心知识点包括字符串字面量、多行字符串、字符串插值、索引访问、拼接修改、查找判断、大小写转换、分割合并、比较以及数字转换等操作。Swift 字符串作为值类型在传递时自动拷贝保证了数据安全同时通过String.Index机制正确处理了 Unicode 字符与字节的差异。掌握这些基础操作后再结合实战案例中的日志格式化与文本统计思路就能在真实项目中灵活运用 Swift 字符串解决各种文本处理需求。