Swift 字符串与字符完全导读(一):从字面量到 Unicode 的实战之旅

作者:unravel2025日期:2025/10/22

前言

Swift 的 String 看起来“像 NSString 的弟弟”,但骨子里是一套全新的 Unicode 抽象模型。

String 与 Character 的本质

  • String:由“扩展字形簇”(extended grapheme cluster)构成的有序集合。
  • Character:一个扩展字形簇,人类眼中的“一个字符”,占用的字节数可变。
1// 1 个 Character,由 2 个 Unicode 标量合成
2let eAcute: Character = "é"                 // “é”
3let eCombining: Character = "\u{65}\u{301}" // “e” + “́” 组合
4print(eAcute == eCombining) // true,两者字形簇等价
5

字符串字面量:单行、多行、转义、扩展分隔符

单行字面量

1let msg = "Hello, Swift" // 类型自动推断为 String
2

多行字面量

1let html = """
2           <div>
3               <p>Hello</p>
4           </div>
5           """ // 缩进 4 空格会被自动去掉,因为闭合 """ 在最左侧第 12 列
6           // 闭合"""左侧的空格会被删除,每一行左侧的同等长度的空格都会被删除
7

换行控制技巧

1let sql = """
2          SELECT * FROM user \
3          WHERE age > 18
4          """ // 反斜杠让源码换行,但字符串里无换行
5

转义序列

1let special = "双引号:\",制表:\t,换行:\n,Unicode:\u{1F496}"
2

扩展分隔符(#)

场景:正则、JSON 模板里想保留原始反斜杠。

1let raw = #"Raw \n still two characters"#
2let needEscape = #"Use \#n to enable line break"#
3print(raw)       // 输出:Raw \n still two characters
4print(needEscape)// 输出:Use
5                 //       to enable line break
6

多行 + 扩展分隔符

1let mlRaw = #"""
2            Line 1
3            Line 2
4            """#
5

空字符串的 3 种创建方式

1let a = ""
2let b = String()
3let c = String("") // 与前两种等价
4print(a.isEmpty) // true
5

可变性:let 与 var 的抉择

1let immutable = "can't change"
2// immutable += "!" // ❌ Compile-time error
3
4var mutable = "hello"
5mutable += ", world" // ✅
6

值类型:写时复制(COW)到底发生了什么

1func foo(_ s: String) {
2    var local = s   // 此时未复制,共享同一块缓冲区
3    local += "!"    // 突变触发复制,O(n) 成本
4    print(local)
5}
6

底层优化:仅当本地突变或跨线程时才真正拷贝,因此作为入参传递时无需担心性能。

字符集合:遍历、提取、构造

1let word = "Swift"
2for ch in word {
3    print(ch, terminator: "-") // S-w-i-f-t-
4}
5
6let single: Character = "A"
7let fromChars = String([single, "B", "C"]) // "ABC"
8

字符串拼接的 5 种姿势

1let left  = "Hello"
2let right = "World"
3
4// 1. 加法
5let s1 = left + ", " + right
6
7// 2. 加法赋值
8var s2 = left
9s2 += ", " + right
10
11// 3. append(Character)
12var s3 = left
13s3.append(",")
14s3.append(" ")
15s3.append(Character(right)) // 仅当 right 长度=1 时安全
16
17// 4. append(contentsOf: String)
18var s4 = left
19s4.append(contentsOf: ", \(right)")
20
21// 5. 多行拼接注意最后一行换行
22let goodStart = """
23                Line 1
24                Line 2
25                """
26let end       = """
27                Line 3
28                """
29let merged = goodStart + end // 3 行,无意外合并
30

字符串插值:最灵活的“模板引擎”

1let name = "Swift"
2let year = 2025
3let msg = "Hello, \(name)! In \(year + 1) we will rock."
4print(msg) // Hello, Swift! In 2026 we will rock.
5
6// 在扩展分隔符中使用插值
7let rawLog = #"Level \#(name) recorded at \#(Date())"#
8

扩展场景:今天就能用上的 3 个小工具

彩色命令行日志

1func log(_ info: String) {
2    print(#"\u{1B}[32m[INFO]\#(info)\u{1B}[0m"#)
3}
4log("Server started") // 终端绿色输出
5

快速 Mock JSON

1let userId = 9527
2let json = #"""
3           {"id": \#(userId), "name": "Alice"}
4           """#
5print(json) // 直接贴进 Postman 即可
6

多行 SQL 模板

1let table = "user"
2let sql = """
3          SELECT *
4          FROM \(table)
5          WHERE status = 'active'
6            AND created_at > ?
7          """
8

Swift 字符串与字符完全导读(一):从字面量到 Unicode 的实战之旅》 是转载文章,点击查看原文


相关推荐


JAVA面试复习笔记(待完善)
paishishaba2025/10/20

目录 布隆过滤器 一、核心思想 二、执行逻辑详解 1. 添加元素 2. 查询元素 三、为什么会有误判? 四、关键参数与性能权衡 五、执行逻辑总结与特点 六、典型应用场景 Redis 的 SETNX 命令 一、基本语法和语义 二、简单示例 三、SETNX 的核心特性 1. 原子性 2. 简单性 3. 无过期时间 四、经典应用场景 1. 分布式锁(最经典的应用) 五、SETNX 的局限性及改进方案 问题1:非原子性的设置过期时间 解决方案:使用 SET 命令


Windows Server,如何使用WSFC+nginx实现集群故障转移
IT橘子皮2025/10/19

在 Windows Server 环境中结合 WSFC(Windows Server Failover Clustering)和 Nginx 实现集群故障转移,核心目标是构建一个既具备应用层高可用性(由 Nginx 负责),又具备基础设施层高可用性(由 WSFC 保障 Nginx 服务本身)的稳固架构。下面这张图清晰地展示了这套架构的完整工作流程: 上图展示了WSFC如何通过心跳检测监控Nginx主节点的状态,并在故障发生时自动将服务(包括虚拟IP和Nginx进程)转移到备节点。下面我们详细拆


AI修图革命:IOPaint+cpolar让废片拯救触手可及
倔强的石头_2025/10/18

文章目录 前言【视频教程】1.什么是IOPaint?2.本地部署IOPaint3.IOPaint简单实用4.公网远程访问本地IOPaint5.内网穿透工具安装6.配置公网地址7.使用固定公网地址远程访问总结 前言 旅行拍照时意外拍到路人闯入?证件照背景不合规?传统修图软件学习成本高,在线工具又担心隐私泄露?IOPaint的出现给出了完美解方——这款开源AI修图工具支持一键擦除多余物体、修复老照片瑕疵,所有操作在本地完成,无需上传原始图片。特别适合摄影爱好者和自媒体创作者,其


“签名”这个概念是非对称加密独有的吗?
你的人类朋友2025/10/16

前言 🍃 你好啊,我是你的人类朋友 ☺️ 本篇文章主要来自于我之前在工作中犯的一个对“签名”的概念的误解 问大家一个问题: "签名"这个概念是非对称加密独有的吗? 先说答案:不是。 虽然【数字签名】确实是非对称加密技术的重要应用,但【"签名"】这个概念在密码学中有着更广泛的含义和应用。 今天就来澄清这个误解,也是我之前在学习信息安全的过程中犯的一个错误 🙀。 正文 一、签名的本质目的 在密码学中,"签名"的核心目的是提供: 身份认证 - 证明消息确实来自声称的发送方 完整性验证 - 确保消


Redis(63)Redis的Lua脚本如何使用?
Victor3562025/10/15

Redis 提供了对 Lua 脚本的支持,使得用户可以在服务器端执行原子操作,从而能够降低网络开销、提高性能和确保操作的原子性。以下是关于如何使用 Redis 的 Lua 脚本的详细指南,并结合实例代码进行说明。 1. 使用 Lua 脚本的基本命令 Redis 提供了两个主要命令来执行 Lua 脚本: EVAL EVALSHA EVAL 命令 EVAL 命令用于直接执行 Lua 脚本。 语法: EVAL script numkeys key [key ...] arg [arg ...]


html5的新增标签
期待~明天2025/10/14

HTML5新增结构标签 HTML5引入了多个语义化标签,用于更清晰地描述网页结构: <header>:定义文档或节的页眉<footer>:定义文档或节的页脚<nav>:定义导航链接<article>:定义独立的内容块<section>:定义文档中的节<aside>:定义页面内容之外的内容(如侧栏) HTML5新增多媒体标签 为支持原生多媒体内容,新增以下标签: <audio>:嵌入音频内容<video>:嵌入视频内容<source>:为多媒体元素定义多种媒体资源<track>:为视频添


在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
IT橘子皮2025/10/12

在高可用架构中,Spring Cloud Gateway 集群的设计是关键环节。下面我将从核心架构、关键配置到生产级优化,为你梳理高可用网关集群的设计方案。 🏗️ 集群架构设计 构建高可用网关集群的核心是消除单点故障,并通过分层设计实现流量可靠分发。 ​核心模式​:标准的解决方案是部署多个 Gateway 实例,并在前端配置一个负载均衡器(如云服务商的SLB/ELB/ALB或自建的Nginx/HAProxy)作为统一的流量入口。所有外部请求先到达负载均衡器,再由其分发到后端的各个Gatewa


先用js快速开发,后续引入ts是否是一个好的实践?
你的人类朋友2025/10/11

前言 我在业余时间做一些小项目时,每次进行技术选型,都会有一个疑问: 应该直接使用 TypeScript 开发,还是先用 JavaScript 快速启动,后续再引入 TypeScript? 今天干脆来整理一下思路,方便后续复用这些想法 正文 一、快速开发的优势 先用 JavaScript 进行快速开发确实有其明显优势: 开发速度更快 无需类型定义和接口声明 跳过类型检查的编译步骤 ⭐ 【重要】特别适合【原型开发】和【概念验证】,个人认为这个是最重要的 学习成本低 更容易上手 ⭐ 【重要】减


深入解析 Vue 3 源码:computed 的底层实现原理
excel2025/10/9

在 Vue 3 的响应式系统中,computed 是一个非常重要的功能,它用于创建基于依赖自动更新的计算属性。本文将通过分析源码,理解 computed 的底层实现逻辑,帮助你从源码层面掌握它的原理。 一、computed 的基本使用 在使用层面上,computed 有两种常见用法: 1. 只读计算属性 const count = ref(1) const plusOne = computed(() => count.value + 1) console.log(plusOne.value)


CICD工具选型指南,Jenkins vs Arbess哪一款更好用?
高效研发之旅2025/10/8

Jenkins是一款常用的CICD工具,Arbess作为一款新兴的国产开源免费的CICD工具,两款工具各有特点。本文将从安装配置、功能特性、用户体验等几个方面对两款软件进行详细对比。 1、安装配置 项目 Jenkins Arbess 安装难度需要预装Java环境,需要手动配置端口和后台服务。一键安装,私有部署不同环境均支持傻瓜式一键安装。配置难度需要配置国内镜像源,安装核心插件零配置,安装后即刻可用,无需额外配置。支持操作系统支持Windows、ma

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0