SafeTypes 🛡️🏰

SafeTypes 是一个 Swift 包,它提供了一套针对常用数据结构和原始类型的约束包装器,强制执行特定条件,并提供在这些边界内安全操作的功能。

如果您以 Swift 5.9+ 为目标平台,我强烈建议您同时安装 SafeTypesMacros。它为字面量添加了非可选初始化器的宏(编译时检查字面量值。例如:#Positive(1) 会被评估为 Postive(1) 而不是 Optional<Postive(1)>,而 #Positive(-1) 将无法编译)。

1

通过在编译时确保条件,SafeTypes 允许开发者编写更安全、更健壮和更具表达力的代码,同时减少样板代码,提高性能,并通过其约束类型改进文档。

ℹ️ 注意:这些自定义类型的大多数构造函数都是可选的,因此任何客户端都需要构造并处理构造时的错误路径。

为了对字面量(仅限字面量,非动态值)进行编译时检查验证(以及非可选初始化器),SafeTypesMacros 添加了特殊的宏来做到这一点!我强烈建议您查看一下!

特性

安装

Swift 包管理器

将以下内容添加到您的 Package.swift 文件的 dependencies 中

.package(url: "https://github.com/lucaswkuipers/SafeTypes.git", from: "1.0.0")

或者只需选择 File > Add Package Dependencies,然后输入以下 URL

https://github.com/lucaswkuipers/SafeTypes.git

然后,在任何需要的地方

import SafeTypes

用法

以下是 SafeTypes 提供的一些类型及其用法的简要示例

集合

MultiElementsArray

保证包含多个元素的数组。

// ✅ Non Optional Initializers

MultiElementsArray(1, 2) // MultiElementsArray<Int>
MultiElementsArray(1.0, 2.0, 3.0) // MultiElementsArray<Double>
MultiElementsArray(false, true, true, false) // MultiElementsArray<Bool>

// ❓ Optional Initializers

MultiElementsArray(["Alice", "Bob"]) // Optional<MultiElementsArray<String>>
MultiElementsArray(repeating: 1, count: 2) // Optional<MultiElementsArray<Int>>

// ❌ Fails to compile

MultiElementsArray(1) // Doesn't compile, missing argument
MultiElementsArray() // Doesn't compile, missing arguments

NonEmptyArray

保证至少包含一个元素的数组。

// ✅ Non Optional Initializers

NonEmptyArray(1) // NonEmptyArray<Int>
NonEmptyArray(1.0, 2.0) // NonEmptyArray<Double>
NonEmptyArray(false, true, true) // NonEmptyArray<Bool>

// ❓ Optional Initializers

NonEmptyArray(["Alice", "Bob"]) // Optional<NonEmptyArray<String>>
NonEmptyArray(repeating: 1, count: 1) // Optional<NonEmptyArray<Int>>

// ❌ Fails to compile

NonEmptyArray() // Doesn't compile, missing arguments

NonEmptyString

保证至少包含一个字符的字符串(可以是空字符)。

// ❓ Optional Initializers

NonEmptyString(["Alice", "Bob"]) // Optional<NonEmptyString>
NonEmptyString(repeating: 1, count: "h") // Optional<NonEmptyString>

// ❌ Fails to compile

NonEmptyString() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #NonEmptyString 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

数字

Positive

保证大于零的数字 (value > 0)

// ❓ Optional Initializers

Positive(123) // Optional<Positive<Int>>
Positive(42.69) // Optional<Positive<Double>>

// ❌ Fails to compile

Positive() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #Positive 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

Negative

保证小于零的数字 (value < 0)

// ❓ Optional Initializers

Negative(-123) // Optional<Negative<Int>>
Negative(-42.69) // Optional<Negative<Double>>

// ❌ Fails to compile

Negative() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #Negative 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

NonPositive

保证小于或等于零的数字 (value <= 0)

// ❓ Optional Initializers

NonPositive(-123) // Optional<NonPositive<Int>>
NonPositive(-42.69) // Optional<NonPositive<Double>>
NonPositive(0) // Optional<NonPositive<Int>>
NonPositive(0.0) // Optional<NonPositive<Double>>

// ❌ Fails to compile
NonPositive() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #NonPositive 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

NonNegative

保证大于或等于零的数字 (value >= 0)

// ❓ Optional Initializers

NonNegative(123) // Optional<NonNegative<Int>>
NonNegative(42.69) // Optional<NonNegative<Double>>
NonNegative(0) // Optional<NonNegative<Int>>
NonNegative(0.0) // Optional<NonNegative<Double>>

// ❌ Fails to compile

NonNegative() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #NonNegative 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

NonZero

保证不等于零的数字 (value != 0)

// ❓ Optional Initializers

NonZero(123) // Optional<NonZero<Int>>
NonZero(42.69) // Optional<NonZero<Double>>
NonZero(-123) // Optional<NonZero<Int>>
NonZero(-42.69) // Optional<NonZero<Double>>

// ❌ Fails to compile

NonZero() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #NonZero 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

MinusOneToOne

表示一个介于 -1 到 1 之间的值,包括 -1 和 1。

// ❓ Optional Initializers

MinusOneToOne(-1) // Optional<MinusOneToOne<Int>>
MinusOneToOne(-1.0) // Optional<MinusOneToOne<Double>>
MinusOneToOne(-0.314159) // Optional<MinusOneToOne<Double>>
MinusOneToOne(0) // Optional<MinusOneToOne<Int>>
MinusOneToOne(0.0) // Optional<MinusOneToOne<Double>>
MinusOneToOne(0.1234) // Optional<MinusOneToOne<Double>>
MinusOneToOne(1) // Optional<MinusOneToOne<Double>>

// ❌ Fails to compile

#MinusOneToOne(-1.1) // Doesn't compile, macro argument can't be less than -1
#MinusOneToOne(42.1) // Doesn't compile, macro argument can't be greater than 1
#MinusOneToOne() // Doesn't compile, missing macro argument
MinusOneToOne() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #MinusOneToOne 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

ZeroToOne

表示一个从 0 到 1 的值,包括 0 和 1。

// ❓ Optional Initializers

ZeroToOne(0) // Optional<ZeroToOne<Int>>
ZeroToOne(0.0) // Optional<ZeroToOne<Double>>
ZeroToOne(0.1234) // Optional<ZeroToOne<Double>>
ZeroToOne(1) // Optional<ZeroToOne<Double>>

// ❌ Fails to compile

ZeroToOne() // Doesn't compile, missing initializer argument

⚠️注意:要使用 #ZeroToOne 和其他有用的宏,请确保安装附加宏 SwiftTypesMacros (Swift 5.9+)

每种类型都保证符合其声明的约束,以便您的函数和方法可以依赖这些特性并传递它们(不丢失信息)。

额外(独立)功能:来自字面量的宏非可选初始化器

SafeTypes 很棒,而 SafeTypesMacros 使它更加出色,它使您能够从字面量构造 SafeTypes 中的类型,并在编译时对其进行评估(判断为有效或无效)。查看一下。

贡献

贡献使开源社区成为学习、启发和创造的绝佳场所。您所做的任何贡献都非常感谢

贡献什么?

如果您想开始贡献但不知道从何入手,请尝试查看开放的 Issues 标签页

贡献步骤

  1. Fork 项目

  2. 创建您的分支 (git checkout -b feature/AmazingFeature)

  3. 提交您的更改 (git commit -m 'Add some AmazingFeature')

  4. 推送到分支 (git push origin feature/AmazingFeature)

  5. 打开 Pull Request

  6. 哦,别忘了在适用时添加或更新测试!:D

非常感谢您的贡献 <3

许可证

根据 MIT 许可证分发。有关更多信息,请参阅 LICENSE

联系方式

欢迎随时与我联系

image

Swift Package Index

SafeTypes 可以在 Swift Package Index 上找到

致谢

一些相关的灵感来源

非常感谢您考虑将 SafeTypes 用于您的下一个 Swift 项目 – 我希望您发现它像我编写它时一样令人愉快!