5月27日 11:50

Swift 字符串怎么拼接、截取和替换?常用方法详解

Swift 的 String 是值类型,基于 Unicode 标量构建。拼接用 + 和插值 \(),截取用 prefix/suffix/dropFirst/dropLast,替换用 replacingOccurrences,查找用 contains/hasPrefix/hasSuffix

拼接最常用字符串插值:"Hello, \(name)",比 + 拼接更灵活,支持表达式。截取要注意 Swift 的 String 不能用整数下标——因为 Unicode 字符长度不等,必须用 String.Index。str.index(str.startIndex, offsetBy: 5) 取偏移位置,str[first..<last] 取子串。

替换支持正则:str.replacingOccurrences(of: "[0-9]", with: "*", options: .regularExpression)。查找除了 contains/hasPrefix/hasSuffix,还可以用 range(of:) 获取位置,ranges(of:) 获取所有匹配位置。

追问

为什么 Swift 的 String 不能用整数下标?

Swift 的 String 是 Unicode 正确的——一个"字符"可能由多个 Unicode 标量组成(如 emoji 👨‍👩‍👧‍👦 由 4 个标量组成)。用整数下标意味着 O(n) 遍历找到位置,所以 Swift 干脆不允许,强制用 String.Index。如果确实需要按下标访问,先转成 Array 再用整数索引。

Substring 和 String 有什么区别?

String 切片得到的是 Substring,它和原 String 共享底层内存(写时复制),不会立即拷贝。Substring 适合临时使用,长期持有应该转成 String(String(substring)),否则原字符串的内存无法释放。函数返回值推荐用 String,内部临时操作用 Substring 省内存。

如何高效拼接大量字符串?

+ 或插值在循环里拼接,每次都创建新字符串,O(n²) 复杂度。高效做法是用 joined()array.joined(separator: ",") 一次完成拼接,或者用 Stringwrite(to:) 流式写入。少量拼接用插值就行,别过早优化。

Swift 字符串比较是按什么规则?

== 比较的是 Unicode 标量是否相同,不是字节相同。"é" 可以是一个标量(U+00E9)也可以是两个(e + 组合重音 U+0301),它们视觉一样但 == 返回 false。如果需要规范比较,用 str.precomposedStringWithCanonicalMapping 先标准化再比较。

写段代码

swift
let str = "Hello, Swift!" // 拼接 let greeting = "Hello, \(name)" // 截取 str.prefix(5) // "Hello" str.suffix(6) // "Swift!" str.dropFirst(7) // "Swift!" // 替换(支持正则) str.replacingOccurrences(of: "Swift", with: "World") str.replacingOccurrences(of: "[aeiou]", with: "*", options: .regularExpression) // 查找 str.contains("Swift") // true str.hasPrefix("Hello") // true str.range(of: "Swift") // Range<String.Index>? // 索引访问 let idx = str.index(str.startIndex, offsetBy: 7) str[idx...] // "Swift!"
标签:Swift