Substring 是 Swift 中用于表示字符串的一部分的类型。它是 String 类型的一个轻量级的视图(view),通常用于处理字符串的子串,而不需要复制原始字符串的数据。
Substring 是什么?
Substring 是一种高效的方式,它允许访问和操作字符串的一部分而不需要复制整个字符串。当从一个 String 中获取一个子串时,Swift 会返回一个 Substring,它不直接存储数据,而是引用原始 String 的一部分。因为它是原始字符串的一部分,它并不会立即创建一个新的字符串副本。
为什么使用 Substring 而不是 String?
Substring 在性能上比 String 更加高效,因为它避免了复制数据。只需要访问一个 String 的子部分时,Substring 可以节省内存开销并提高性能。
例如:
let str = "Hello, world!"
let subStr = str.prefix(5) // subStr 是一个 Substring,表示 "Hello"
在上面的代码中,subStr 只是 str 的前 5 个字符的视图,而不是一个新的字符串副本。

Substring 与 String 的不同
内存管理:Substring 是对原始 String 的引用,不会立即复制数据。当 Substring 被创建时,它不会分配新的内存,而是指向原始 String 中的数据。
生命周期:Substring 会保持对原始 String 的引用,直到原始 String 被销毁。因此,如果原始 String 的生命周期结束,Substring 也会变得无效。
转换为 String:如果需要将 Substring 转换为独立的 String,可以通过显式调用 String() 来进行转换。
Substring 的常见使用场景
从字符串中提取部分内容:只需要字符串的一部分时,使用 Substring 可以避免不必要的内存开销。
字符串分割:通过 split(separator:) 方法将字符串分割成多个部分时,会返回 Substring 类型的结果。
如何将 Substring 转换为 String?
虽然 Substring 是 String 的视图,但它并不是 String 类型。如果需要将 Substring 转换为一个独立的 String,可以使用 String() 构造器。
例如:
let str = "Hello, world!"
let subStr = str.prefix(5) // Substring 类型
let stringSubStr = String(subStr) // 转换为 String 类型
实际场景
在解析 CSV 文件时,列的数据通常是通过逗号分隔的字符串。使用 split(separator:) 方法将行分割成多个字段时,返回的是 Substring 类型。由于我们在处理数据时,常常需要将某些部分转换为特定类型(例如将日期字符串转换为 Date 类型),这时如果数据是 Substring,就必须将其显式转换为 String,以便进行日期解析或其他操作。
let dateString = String(columns[0]) // 转换 Substring 为 String
总结
Substring 是 String 的一个轻量级视图,它没有复制原始字符串的数据。
如果需要对 Substring 进行更复杂的操作或类型转换(如日期解析),通常需要将它转换为 String。
通过 String() 构造器,可以将 Substring 转换为独立的 String 对象。