SafeTypes 是一个 Swift 包,它提供了一套针对常用数据结构和原始类型的约束包装器,强制执行特定条件,并提供在这些边界内安全操作的功能。
如果您以 Swift 5.9+ 为目标平台,我强烈建议您同时安装 SafeTypesMacros。它为字面量添加了非可选初始化器的宏(编译时检查字面量值。例如:#Positive(1) 会被评估为 Postive(1) 而不是 Optional<Postive(1)>,而 #Positive(-1) 将无法编译)。
通过在编译时确保条件,SafeTypes 允许开发者编写更安全、更健壮和更具表达力的代码,同时减少样板代码,提高性能,并通过其约束类型改进文档。
ℹ️ 注意:这些自定义类型的大多数构造函数都是可选的,因此任何客户端都需要构造并处理构造时的错误路径。
为了对字面量(仅限字面量,非动态值)进行编译时检查验证(以及非可选初始化器),SafeTypesMacros 添加了特殊的宏来做到这一点!我强烈建议您查看一下!
将以下内容添加到您的 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 提供的一些类型及其用法的简要示例
保证包含多个元素的数组。
// ✅ 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
保证至少包含一个元素的数组。
// ✅ 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
保证至少包含一个字符的字符串(可以是空字符)。
// ❓ 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+)
保证大于零的数字 (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+)
保证小于零的数字 (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+)
保证小于或等于零的数字 (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+)
保证大于或等于零的数字 (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+)
保证不等于零的数字 (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+)
表示一个介于 -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+)
表示一个从 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 标签页
Fork 项目
创建您的分支 (git checkout -b feature/AmazingFeature
)
提交您的更改 (git commit -m 'Add some AmazingFeature'
)
推送到分支 (git push origin feature/AmazingFeature
)
打开 Pull Request
哦,别忘了在适用时添加或更新测试!:D
非常感谢您的贡献 <3
根据 MIT 许可证分发。有关更多信息,请参阅 LICENSE。
欢迎随时与我联系
SafeTypes 可以在 Swift Package Index 上找到
一些相关的灵感来源
非常感谢您考虑将 SafeTypes 用于您的下一个 Swift 项目 – 我希望您发现它像我编写它时一样令人愉快!