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 字符串解决各种文本处理需求。

相关新闻

单片机毕设项目:基于 STM32/51 单片机的水体 pH 浊度温度一体化监测系统 基于 STM32/51 单片机的 ADC 模数转换水质采集终端设计(021603)

单片机毕设项目:基于 STM32/51 单片机的水体 pH 浊度温度一体化监测系统 基于 STM32/51 单片机的 ADC 模数转换水质采集终端设计(021603)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 16:21:45 阅读更多 →
LRCGET 上手实战:3 步批量下载 LRC 歌词,离线音乐库也能逐句跟唱

LRCGET 上手实战:3 步批量下载 LRC 歌词,离线音乐库也能逐句跟唱

LRCGET 上手实战:3 步批量下载 LRC 歌词,离线音乐库也能逐句跟唱 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget LRCGET 是一款…

2026/8/18 13:30:18 阅读更多 →
AArch64内建函数实战:用stdarch驾驭NEON、SVE与SVE2三大利器

AArch64内建函数实战:用stdarch驾驭NEON、SVE与SVE2三大利器

AArch64内建函数实战:用stdarch驾驭NEON、SVE与SVE2三大利器 【免费下载链接】stdarch Rusts standard library vendor-specific APIs and run-time feature detection 项目地址: https://gitcode.com/gh_mirrors/st/stdarch 如果你正在为 Apple Silicon&…

2026/8/18 13:30:18 阅读更多 →

最新新闻

门店想在微信上卖货怎么选平台?到店自提、核销和会员能力对比

门店想在微信上卖货怎么选平台?到店自提、核销和会员能力对比

门店想在微信上卖货怎么选平台?到店自提、核销和会员能力对比门店想在微信上卖货,和纯电商不完全一样。除了商品、订单、支付,还要看到店自提、核销、会员储值、预约排期、员工处理和同城配送,这些才是本地生活商家的日常经营重点…

2026/8/19 19:00:18 阅读更多 →
磁力链接转种子文件实战指南:Magnet2Torrent 从安装到批量转换的完整记录

磁力链接转种子文件实战指南:Magnet2Torrent 从安装到批量转换的完整记录

磁力链接转种子文件实战指南:Magnet2Torrent 从安装到批量转换的完整记录 【免费下载链接】Magnet2Torrent This will convert a magnet link into a .torrent file 项目地址: https://gitcode.com/gh_mirrors/ma/Magnet2Torrent 如果你习惯把待下载的资源以…

2026/8/19 19:00:18 阅读更多 →
无名杀网页版从零开玩指南:5 分钟跑起来,还能亲手造武将的三国杀开源项目

无名杀网页版从零开玩指南:5 分钟跑起来,还能亲手造武将的三国杀开源项目

无名杀网页版从零开玩指南:5 分钟跑起来,还能亲手造武将的三国杀开源项目 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 先问一个问题:你上一次玩三国杀,是不是先要下载几百 MB 的客…

2026/8/19 19:00:18 阅读更多 →
OpenRGB 终极上手:一个软件统一控制全部 RGB 设备,三步清走常驻后台

OpenRGB 终极上手:一个软件统一控制全部 RGB 设备,三步清走常驻后台

OpenRGB 终极上手:一个软件统一控制全部 RGB 设备,三步清走常驻后台 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcPro…

2026/8/19 19:00:17 阅读更多 →
LTX-2.5免费商用指南:一文读懂LTX-2.x社区许可协议,年营收千万美元内零成本使用

LTX-2.5免费商用指南:一文读懂LTX-2.x社区许可协议,年营收千万美元内零成本使用

LTX-2.5免费商用指南:一文读懂LTX-2.x社区许可协议,年营收千万美元内零成本使用 【免费下载链接】LTX-2.5 项目地址: https://ai.gitcode.com/hf_mirrors/Lightricks/LTX-2.5 LTX-2.5 是 Lightricks 推出的开源权重 AI 视频生成模型(…

2026/8/19 19:00:14 阅读更多 →
ComfyUI 工作效率终极指南:KJNodes 节点包从安装到进阶一次讲透

ComfyUI 工作效率终极指南:KJNodes 节点包从安装到进阶一次讲透

ComfyUI 工作效率终极指南:KJNodes 节点包从安装到进阶一次讲透 【免费下载链接】ComfyUI-KJNodes Various custom nodes for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-KJNodes 在 ComfyUI 里搭一条工作流,最让人抓狂的往往…

2026/8/19 18:59:12 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/19 11:55:18 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 9:46:27 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/19 5:04:55 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/19 7:42:22 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/19 11:55:13 阅读更多 →