Swift 抽象类是一个轻量级库和一些可执行文件,允许 Swift 项目在编译时安全地进行抽象类开发。
此项目包含两个独立的部分,它们协同工作以执行抽象类验证。`AbstractClassFoundation` 模块包含一个抽象类应遵守的 `protocol`。
import AbstractClassFoundation
class MyAbstractClass: AbstractClass {
var anAbstractProperty: PropertyType {
abstractMethod()
}
func anAbstractMethod(_ arg1: Arg, arg2: Arg) -> MyReturnType {
abstractMethod()
}
func aConcreteMethod() {
// Method implementation omitted.
}
}
抽象类的子类也可以是抽象的。
class AnotherAbstractClass: MyAbstractClass {
func anotherAbstractMethod() {
abstractMethod()
}
}
此项目的第二部分是 `abstractclassvalidator` 可执行文件。验证器解析指定的 Swift 源文件以生成类层次结构的内存图。根据类数据模型,它然后验证实现是否符合抽象类规则。这些规则包括抽象类不能直接实例化;抽象类的具体子类必须提供其类层次结构中所有抽象属性和方法的实现。
为了使此验证能够在编译时执行,项目添加了一个 Xcode 预构建运行脚本来执行阶段。请参阅下面的 验证器集成部分 了解详情。
使用 Carthage
请遵循标准的 Carthage 安装流程,将 AbstractClassFoundation
框架集成到您的 Swift 项目中。
github "https://github.com/uber/swift-abstract-class.git" ~> VERSION
使用 Swift 包管理器
请通过标准的 Swift 包管理器包定义流程,将 AbstractClassFoundation
框架集成到您的 Swift 项目中。
dependencies: [
.package(url: "https://github.com/uber/swift-abstract-class.git", .upToNextMajor(from: "VERSION_NUMBER")),
],
targets: [
.target(
name: "YOUR_MODULE",
dependencies: [
"AbstractClassFoundation",
]),
],
使用 CocoaPods
请遵循标准的 pod 集成流程,并使用 AbstractClassFoundation
pod。
使用 Carthage
如果使用 Carthage 集成 AbstractClassFoundation
框架,则对应版本的验证器执行文件的副本已经下载到 Carthage 文件夹中。可以在 Carthage/Checkouts/swift-abstract-class/Validator/bin/abstractclassvalidator
找到。
使用 Homebrew
无论如何将 AbstractClassFoundation
框架集成到您的项目中,验证器都可以通过 Homebrew 安装。
brew install abstractclassvalidator
虽然可以从命令行调用验证器,但将其直接集成到构建系统中最为方便。由于绝大多数 Swift 应用程序使用 Xcode 作为构建系统,因此我们将在这里介绍。
- 下载最新的 valiordat 二进制文件,可以从 发布页面 手动下载,或者使用 Carthage 或 Homebrew。
- 在应用程序的可执行目标“构建阶段”部分添加一个“运行脚本”阶段。
- 请确保“Shell”值为
/bin/sh
。 - 在脚本框中添加一个shell脚本,调用验证器。例如,使用Carthage下载的二进制文件:
export SOURCEKIT_LOGGING=0 && ../Carthage/Checkouts/swift-abstract-class/Validator/bin/abstractclassvalidator validate Sources/
。- 如果通过Carthage安装,可以通过指向Xcode项目文件相对于的Carthage checkout来调用二进制文件。在我们的示例中,此路径是
../Carthage/Checkouts/swift-abstract-class/Validator/bin/abstractclassvalidator validate
。 - 如果通过Homebrew安装,可以直接通过调用
abstractclassvalidator validate
来执行二进制文件
- 如果通过Carthage安装,可以通过指向Xcode项目文件相对于的Carthage checkout来调用二进制文件。在我们的示例中,此路径是
脚本的第一个部分export SOURCEKIT_LOGGING=0
会关闭SourceKit日志,否则Xcode会将日志显示为错误信息。这只是为了减少Xcode中的噪音。这并不是严格必要的。脚本的其他部分调用验证器可执行文件,并带有一些参数。如果验证器是通过Carthage安装的,请注意,验证器可执行文件二进制文件的路径相对于Xcode项目的位置是相对的。在我们的示例应用程序中,路径是../Carthage/Checkouts/swift-abstract-class/Validator/bin/abstractclassvalidator
。这可能会根据您的项目文件夹结构而有所不同。第一个参数validate
告诉可执行文件运行代码验证命令。第二个参数Sources/
告诉验证器解析所有应用程序源代码的位置。有关所有可能的参数,请参阅下面的部分。
这就是Xcode集成的全部内容。现在,每次Xcode构建应用程序时,都会运行抽象类验证器,以确保抽象类及其具体子类遵循抽象类规则。
validate
:指示验证器解析Swift源文件并验证是否正确遵循抽象类规则。version
打印验证器的版本。
- Swift源文件根文件夹的路径,或包含指定格式中路径的文本文件。可以指定任意数量的路径。所有源列表文件都必须是同一格式。有关源列表文件的更多详细信息,请参阅下面的部分。例如,
Sources/ sources_list_file.txt
指示验证器递归解析“Sources”目录内的所有Swift源文件,以及“sources_list_file.txt”文件中包含的源路径。
验证器可以解析目录中所有Swift文件(包括子目录中的文件),或者如果指定了文件,则验证器假设该文件是包含Swift源文件路径的文本文件。该文件被称为源列表文件。支持此文件的两种格式,newline
和minescaping
。在newline
格式中,验证器假设源列表文件中的每行都是一个包含要解析的Swift源文件的单独路径。在minescaping
格式中,如果需要转义,则使用单引号转义路径,而无需转义的路径则不包含任何引号。所有路径都由单个空格字符分隔。如果需要,请使用--sources-list-format
可选参数来指定格式。
如果给定了多个源列表文件给到validate
命令,它们都必须有相同的格式。
--sources-list-format
:Swift源列表文件的格式。如果此参数未指定,则假定所有源列表文件都使用newline
格式。请参阅上面的来源列表文件
部分以获取更多详细信息。
--exclude-suffixes
:要忽略解析的文件名后缀列表。例如,使用--exclude-suffixes Tests Mocks
,验证器将忽略任何文件名的名称(不包括文件扩展名),以“Test”或“Mocks”结尾。
--exclude-paths
:要忽略解析的路径字符串列表。例如,使用--exclude-paths /sample /tests
,验证器将忽略任何路径包含“/sample”或“/tests”的文件。
--collect-parsing-info
:一个布尔值,表示是否应收集解析执行超时错误的信息。默认为false
。
--timeout
:用于等待解析和验证任务的超时时间,单位为秒。默认为30秒。
--concurrency-limit
:可以并发执行的最大任务数。默认为硬件允许的最大并发数。
如果您喜欢Needle,您可以查看我们团队的其他相关开源项目。
- Needle:一个编译时安全的Swift依赖注入框架。
- Swift Concurrency:一个由Uber使用的并发实用程序类集合,灵感来源于java.util.concurrent包中的类。
- Swift Common:这个Swift开源项目集合中使用的公用库。