Swift: Swift 字符串与字符:String 类型详解与实用方法

字符串是日常开发中使用最频繁的数据类型——本课带你全面掌握 Swift 中 String 和 Character 的操作方法。

1. 你将学到


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) "!!!"
100%
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 通过写时复制优化只在修改时真正复制,所以性能开销很小。

📖 小节


📝 作业

  1. 基础题: 用字符串插值生成一句话:"My name is X, I am Y years old.",用变量存储姓名和年龄。
  2. 进阶题: 写一个程序检查用户输入的邮箱是否有效。要求:包含 @.,长度大于 5,以小写输出。
  3. 挑战题: 用多行字符串生成一个 HTML 邮件模板,包含标题、正文和页脚三个段落,其中用户名、产品名和价格用插值嵌入。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏