标准库
Swift 标准库定义了编写 Swift 程序的基础功能层。标准库的文档目前托管在 Apple 开发者网站上。
Swift 标准库及其测试和内联文档是主 Swift 仓库的一部分。
标准库预览包
标准库预览包 提供了对标准库新增功能的早期访问。当可以通过 Swift 演进过程接受可以作为独立库实现的新标准库 API 时,它们将作为单独的包发布,并包含在作为伞状库的预览包中。预览包目前包含以下单独的包
包 | 描述 |
---|---|
SE0270_RangeSet | 对集合的非连续子范围执行操作,例如 subranges(where:) 和 moveSubranges(_:to:) ,以及支持的 RangeSet 类型。 |
SE0288_IsPower | 使用 isPower(of:) 方法扩展 BinaryInteger ,该方法返回整数是否为另一个整数的幂。 |
标准库设计
Swift 标准库包含许多数据类型、协议和函数,包括基本数据类型(例如,Int
、Double
)、集合(例如,Array
、Dictionary
)以及描述它们的协议和对其进行操作的算法、字符和字符串以及底层原语(例如,UnsafeMutablePointer
)。标准库的实现在 Swift 仓库 中的 stdlib/public
子目录中,该子目录进一步细分为
-
标准库核心:标准库的核心(在 stdlib/public/core 中实现),包括所有数据类型、协议、函数等的定义。
-
运行时:语言支持运行时(在 stdlib/public/runtime 中实现),它位于编译器和核心标准库之间。它负责实现语言的许多动态特性,例如类型转换(例如,用于
as!
和as?
运算符)、类型元数据(以支持泛型和反射)和内存管理(对象分配、引用计数等)。与更高级别的库不同,运行时主要用 C++ 或(在互操作性需要时)Objective-C 编写。 -
SDK 覆盖层:特定于 Apple 平台,SDK 覆盖层(在 stdlib/public/Platform 中实现)为现有的 Objective-C 框架提供特定于 Swift 的添加和修改,以改进它们到 Swift 的映射。特别是,
Foundation
覆盖层为与 Objective-C 代码的互操作性提供了额外的支持。
Swift 标准库是用 Swift 编写的,但由于它是堆栈中最低级别的 Swift 代码——负责实现构建其他 Swift 代码所基于的核心数据类型——它与普通的 Swift 代码有点不同。一些差异包括
-
访问编译器内置函数:
Builtin
模块通常仅可供标准库访问,它提供编译器内置函数(例如,直接创建 SIL 指令)和数据类型(例如,“原始”指针、原始 LLVM 整数类型),这些函数和数据类型是实现 Swift 编程基础数据类型所必需的。 -
可见性通常通过约定管理:由于标准库的编译和优化方式,标准库声明通常需要比通常希望的更高的可见性。例如,从不使用
private
修饰符。更重要的是,即使某些内容不打算作为公共接口的一部分,也经常需要将其设为public
。在这种情况下,应使用前导下划线来指示公共 API 旨在设为私有。标准库中访问控制的策略记录在 docs/AccessControlInStdlib.rst 中。 -
重复代码使用 gyb:gyb 是一个简单的工具,用于从模板生成重复代码,该模板在标准库中经常使用。例如,它用于从单个源创建各种大小的整数类型(
Int8
、Int16
、Int32
、Int64
等)的定义。 -
测试与编译器紧密耦合:标准库和编译器一起发展并且紧密耦合。核心数据类型(例如,
Array
或Int
)的更改可能需要编译器端的更改,反之亦然,因此标准库测试套件与编译器存储在相同的目录结构中,位于 test/stdlib 和 validation-test/stdlib 中。