Swift: Swift 字符串与字符:String 类型详解与实用方法
字符串是日常开发中使用最频繁的数据类型——本课带你全面掌握 Swift 中 String 和 Character 的操作方法。
1. 你将学到
- String 的创建、拼接与比较
- 字符串插值语法和格式化输出
- 多行字符串的缩进规则
- Character 字符类型与字符串遍历
- 字符串常用方法:count、hasPrefix、uppercased 等
2. 一个客户运营专员的真实故事
(1) 痛点:手动拼接邮件模板效率低且易错
Charlie 是 SaaS 公司的客户运营专员,每周要向 2,000+ 客户发送个性化邮件。他最初用加号拼接字符串:
SWIFT
let firstName = "Alice"
let lastName = "Johnson"
let product = "Premium Plan"
let price = "299.00"
let email = "Dear " + firstName + " " + lastName + ",\n\nThank you for purchasing " + product + "!\nYour payment: $" + price + ".\n\nBest regards,\nCharlie"
代码又长又难维护,一旦模板格式变化就需要整段重写。上周他因为漏加了一个空格,把 "Dear AliceJohnson" 发给了 300 多个客户。
(2) 字符串插值的解法
Charlie 改用 Swift 的字符串插值语法,模板变得清晰易读:
SWIFT
let firstName = "Alice"
let lastName = "Johnson"
let product = "Premium Plan"
let price = "299.00"
let email = """
Dear \(firstName) \(lastName),
Thank you for purchasing \(product)!
Your payment: $\(price).
Best regards,
Charlie
"""
print(email)
输出:
TEXT 📖 仅展示Dear Alice Johnson, Thank you for purchasing Premium Plan! Your payment: $299.00. Best regards, Charlie
(3) 收益:模板代码可维护性提升
| 维度 | 之前(拼接) | 之后(插值) |
|---|---|---|
| 每封邮件代码量 | 8 行拼接 + 转义 | 4 行插值 |
| 模板修改时间 | 5-10 分钟 | 30 秒 |
| 出错率 | 每月 3-5 次 | 0 次 |
| 可读性 | 符号混杂,极难校对 | 接近纯文本模板 |
3. 字符串创建与拼接
Swift 的 String 类型功能强大,提供了多种创建和操作字符串的方式。
(1) 字符串字面量
用双引号包裹文本创建字符串。Swift 支持 Unicode,包括 emoji:
SWIFT
let greeting = "Hello, Swift!"
let empty = "" // 空字符串
let emoji = "Swift" // 包含 Unicode
| 创建方式 | 语法 | 说明 |
|---|---|---|
| 字面量 | let s = "Hello" |
最常用 |
| 空字符串 | let s = "" |
空字符串 |
| 初始化器 | String() |
创建空字符串 |
| 重复 | String(repeating: "!", count: 3) |
"!!!" |
graph LR
A[String 创建] --> B["字面量: \"Hello\""]
A --> C[初始化器: String]
A --> D[重复: repeating count]
A --> E[拼接: +]
A --> F[插值: \\(value)]
(2) 字符串拼接
用 + 或 += 拼接字符串,也可用 append 方法:
SWIFT
let firstName = "Alice"
let lastName = "Johnson"
// 使用 + 拼接
let fullName = firstName + " " + lastName
print(fullName) // Alice Johnson
// 使用 += 追加
var message = "Hello"
message += ", "
message += firstName
print(message) // Hello, Alice
// 使用 append 方法
var greeting2 = "Welcome"
greeting2.append("!")
print(greeting2) // Welcome!
▶ 示例:邮件地址生成
SWIFT
// ============================================
// 从用户信息生成邮件地址
// 演示字符串创建和拼接
// ============================================
let domain = "@example.com"
let alice = "alice.johnson"
let bob = "bob.smith"
let charlie = "charlie.brown"
let email1 = alice + domain
let email2 = bob + domain
let email3 = charlie + domain
print(email1)
print(email2)
print(email3)
// 拼接完整 URL
let scheme = "https://"
let site = "api."
let fullURL = scheme + site + domain
print("API URL: \(fullURL)")
输出:
TEXT 📖 仅展示alice.johnson@example.com bob.smith@example.com charlie.brown@example.com API URL: https://api.example.com
4. 字符串插值与常用方法
字符串插值是 Swift 最强大的字符串特性之一,可以在字符串中嵌入变量、表达式甚至函数调用。
(1) 字符串插值
使用 \(expression) 语法将任意值嵌入字符串:
SWIFT
let name = "Alice"
let age = 28
let height = 1.75
let intro = "My name is \(name), I am \(age) years old and \(height) meters tall."
print(intro)
// My name is Alice, I am 28 years old and 1.75 meters tall.
// 插值中可以写表达式
let price = 29.99
let qty = 3
let summary = "Total: $\(price * Double(qty))"
print(summary)
// Total: $89.97
| 插值内容 | 写法 | 结果 |
|---|---|---|
| 变量 | \(name) |
变量的值 |
| 表达式 | \(price * 0.9) |
计算结果 |
| 方法调用 | \(name.uppercased()) |
方法返回值 |
| 多个值 | \(a) + \(b) = \(a + b) |
逐个嵌入 |
(2) 常用字符串方法
Swift 的 String 提供了丰富的内置方法:
SWIFT
let text = "Hello, Swift!"
text.count // 13(字符数)
text.isEmpty // false
text.hasPrefix("Hello") // true
text.hasSuffix("Swift!") // true
text.uppercased() // "HELLO, SWIFT!"
text.lowercased() // "hello, swift!"
text.contains("Swift") // true
| 方法 | 作用 | 示例 | 结果 |
|---|---|---|---|
count |
字符数量 | "Hello".count |
5 |
isEmpty |
是否为空 | "".isEmpty |
true |
hasPrefix |
是否以某前缀开头 | "Swift".hasPrefix("Sw") |
true |
hasSuffix |
是否以某后缀结尾 | "Swift".hasSuffix("ft") |
true |
uppercased |
转大写 | "Swift".uppercased() |
"SWIFT" |
lowercased |
转小写 | "Swift".lowercased() |
"swift" |
contains |
是否包含某子串 | "Hello".contains("ell") |
true |
▶ 示例:用户信息卡片
SWIFT
// ============================================
// 生成格式化的用户信息卡片
// 演示字符串插值和常用方法
// ============================================
let firstName = "Alice"
let lastName = "Johnson"
let email = "alice.johnson@example.com"
let role = "Admin"
// 使用插值组合信息
let displayName = "\(firstName) \(lastName)"
let emailDomain = email.contains("@") ? email.split(separator: "@")[1] : "unknown"
// 验证格式
let isValidEmail = email.contains(".") && email.contains("@")
let isAdmin = role.uppercased() == "ADMIN"
print("=== User Card ===")
print("Name: \(displayName)")
print("Email: \(email)")
print("Domain: \(emailDomain)")
print("Valid Email: \(isValidEmail)")
print("Admin: \(isAdmin)")
print("Name Length: \(displayName.count) chars")
输出:
TEXT 📖 仅展示=== User Card === Name: Alice Johnson Email: alice.johnson@example.com Domain: example.com Valid Email: true Admin: true Name Length: 13 chars
5. 多行字符串与 Character
Swift 提供三引号语法创建多行字符串,Character 类型表示单个字符。
(1) 多行字符串
用三个双引号 """ 包裹,保留换行和缩进:
SWIFT
let poem = """
Roses are red,
Violets are blue,
Swift is awesome,
And so are you!
"""
print(poem)
输出:
TEXT 📖 仅展示Roses are red, Violets are blue, Swift is awesome, And so are you!
多行字符串的缩进规则:结束符 """ 的位置决定了每行前面可以去掉多少空白:
SWIFT
let indented = """
Line 1
Line 2
"""
// 每行前面的 4 个空格会被去掉
| 特性 | 单行字符串 | 多行字符串 |
|---|---|---|
| 语法 | "..." |
"""...""" |
| 换行 | 需写 \n |
直接换行 |
| 引号 | 需转义 \" |
可直接写 " |
| 缩进处理 | 无 | 基于结束符位置 |
(2) Character 类型
Character 代表一个可见字符(Unicode 标量),一个字符串由多个 Character 组成:
SWIFT
let ch: Character = "A"
let emoji: Character = ""
// 遍历字符串中的每个字符
let greeting = "Hi!"
for char in greeting {
print(char)
}
// 输出:H i !
▶ 示例:文本排版
SWIFT
// ============================================
// 生成格式化的产品说明
// 演示多行字符串和 Character 遍历
// ============================================
let productName = "Swift Pro"
let version = "2.0"
let features = ["Fast", "Safe", "Modern", "Open Source"]
// 使用多行字符串构建产品介绍
let description = """
Product: \(productName)
Version: \(version)
Features:
- \(features[0])
- \(features[1])
- \(features[2])
- \(features[3])
"""
print(description)
// 遍历产品名中的每个字符
print("Product name characters:")
for ch in productName {
print("[\(ch)]", terminator: " ")
}
print()
输出:
TEXT 📖 仅展示Product: Swift Pro Version: 2.0 Features: - Fast - Safe - Modern - Open Source Product name characters: [S] [w] [i] [f] [t] [ ] [P] [r] [o]
6. 完整示例:客户邮件生成器
SWIFT
// ============================================
// 客户邮件生成器
// 功能:字符串拼接、插值、多行、方法
// ============================================
import Foundation
// 1. 客户数据
let customerName = "Charlie Brown"
let projectName = "DataSync Pro"
let dueDate = "2026-08-15"
let amount = 2499.00
// 2. 邮件主题
let subject = "Invoice for \(projectName) - Due \(dueDate)"
print("Subject: \(subject)")
print(String(repeating: "=", count: subject.count + 10))
// 3. 邮件正文(多行字符串 + 插值)
let body = """
Dear \(customerName),
Thank you for choosing \(projectName).
Invoice Summary:
- Project: \(projectName)
- Amount: $\(String(format: "%.2f", amount))
- Due Date: \(dueDate)
Please make the payment by \(dueDate).
If you have any questions, feel free to reply.
Best regards,
Swift Tech Team
"""
print(body)
// 4. 邮件验证
let isValidSubject = subject.hasPrefix("Invoice")
let containsProjectName = body.contains(projectName)
let isFormatted = body.hasSuffix("Team\n")
print("=== Validation ===")
print("Valid Subject: \(isValidSubject)")
print("Contains Project: \(containsProjectName)")
print("Proper Formatting: \(isFormatted)")
print("Body Length: \(body.count) chars")
输出:
TEXT 📖 仅展示Subject: Invoice for DataSync Pro - Due 2026-08-15 ============================================== Dear Charlie Brown, Thank you for choosing DataSync Pro. Invoice Summary: - Project: DataSync Pro - Amount: $2499.00 - Due Date: 2026-08-15 Please make the payment by 2026-08-15. If you have any questions, feel free to reply. Best regards, Swift Tech Team === Validation === Valid Subject: true Contains Project: true Proper Formatting: true Body Length: 278 chars
❓ 常见问题
Q 字符串插值和加号拼接哪个性能更好?
A 插值性能略优于拼接。插值会在编译期优化为 append 方法,而多段拼接会创建多个中间字符串。日常开发中差距不大,优先考虑可读性。
Q 多行字符串中的缩进是如何计算的?
A 以结束符
""" 的位置为基准。结束符前面的空白字符数量会被从每行内容的前面去掉。如果某行缩进少于结束符,整行不缩进。Q Character 和 String 有什么区别?
A Character 是单个可见字符(Unicode 标量),String 是多个 Character 的集合。一个 String 可以由 0 到多个 Character 组成。
Q Swift 的 String 是值类型还是引用类型?
A String 是值类型(struct)。每次赋值或传参都会复制,但 Swift 通过写时复制优化只在修改时真正复制,所以性能开销很小。
📖 小节
- 字符串用双引号创建,空字符串用
""或String() - 用
+拼接字符串,用+=追加内容 - 字符串插值
\(expression)可将任意值嵌入字符串 - 常用方法:count、isEmpty、hasPrefix、hasSuffix、uppercased、contains
- 多行字符串用
"""包裹,缩进由结束符位置决定 - Character 表示单个字符,可遍历 String 获取每个 Character
📝 作业
- 基础题: 用字符串插值生成一句话:"My name is X, I am Y years old.",用变量存储姓名和年龄。
- 进阶题: 写一个程序检查用户输入的邮箱是否有效。要求:包含
@和.,长度大于 5,以小写输出。 - 挑战题: 用多行字符串生成一个 HTML 邮件模板,包含标题、正文和页脚三个段落,其中用户名、产品名和价格用插值嵌入。