Swift 字符串

Swift 字符串(String)全解析(2025 版)

“String 是值类型、支持 Unicode、功能强大” —— 掌握 50+ 操作,写出 安全、优雅、国际化 的文本处理代码!


一、Swift 字符串核心特性

特性说明
值类型赋值时复制,线程安全
Unicode 合规支持 emoji、中文、组合字符
集合类型可遍历字符、子串
桥接 FoundationNSString 无缝互操作
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: "*")

十三、性能优化技巧

场景推荐做法
频繁拼接Stringappend+=
大量拼接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 + ts += 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"(首字母大写)!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部