服务端阅读 05月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: ",") 一次完成拼接,或者用 String 的 write(to:) 流式写入。少量拼接用插值就行,别过早优化。Swift 字符串比较是按什么规则?== 比较的是 Unicode 标量是否相同,不是字节相同。"é" 可以是一个标量(U+00E9)也可以是两个(e + 组合重音 U+0301),它们视觉一样但 == 返回 false。如果需要规范比较,用 str.precomposedStringWithCanonicalMapping 先标准化再比较。写段代码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") // truestr.hasPrefix("Hello") // truestr.range(of: "Swift") // Range<String.Index>?// 索引访问let idx = str.index(str.startIndex, offsetBy: 7)str[idx...] // "Swift!"