测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年9月 |
SwiftSwift版本 | 4.0 |
SPM支持SPM | ✗ |
由Bartosz Polaczyk维护。
用于枚举所有枚举情况的库(用于Swift
或Int
RawValue
)。
EnumList不依赖于非内存反射,因此设计上稳健,在未来的Swift版本中更加稳定。
此分支官方支持Swift 3.1,但代码与Swift 4.0兼容。
如果想要使用具有Codable
支持的Swift 4.0,请检查swift4
分支。
为了使您的enum
(具有String
原始值)与EnumList
兼容,请添加符合协议EnumListStringRaw<NAME_OF_YOUR_ENUM.Values>, RawRepresentable
,并定义嵌套结构体Values
。
尽管您可以选择名称和放置符合StringEnumValues
或IntEnumValues
的结构体(例如,YourEnumName.Values
),但建议将其保持为嵌套类型。
private enum YourEnumName: EnumListStringRaw<YourEnumName.Values>, RawRepresentable{
struct Values:StringEnumValues {
typealias Element = YourEnumName
static var allRaws:Set<String> = []
}
case caseNo1 = "case1"
case caseNo2 = "case2"
//case caseNo3 = "case2" - compile error: RawValues have to be unique
}
YourEnumName.Values.all // Set([.caseNo1, .caseNo2])
YourEnumName.Values.allRaws // Set(["case1", "case2"])
您所有的情况都存在于静态的Set<YourEnumName>
变量`YourEnumName.Values.all.
您仍然可以使用之前的方法创建您的枚举实例,使用字面量初始化`init?(rawValue:)`。
let myCase = YourEnumName(rawValue: "case1") // myCase = .caseNo1
如果您不能使用字面量(例如当您从其他地方接收到的只有String实例时),您可以使用`init?(raw:)`初始化器创建它。
let someString = "case1"
...
let myCase = YourEnumName(raw: someString) // myCase = .caseNo1
let myOtherCase = YourEnumName(raw: "case1") // myOtherCase = .caseNo1
Int
原始值的枚举在处理带有Int
原始值时,EnumList
的作用相同
private enum YourIntEnum: EnumListIntRaw<YourIntEnum.Values>, RawRepresentable{
struct Values:IntEnumValues {
typealias Element = YourIntEnum
static var allRaws:Set<Int> = []
}
case caseNo1 = 1
case caseNo2 = 3
}
YourIntEnum.Values.all // Set([.caseNo1, .caseNo2])
YourIntEnum.Values.allRaws // Set([1, 2])
let myCase = YourIntEnum(rawValue: 1) // .caseNo1
与标准 enum
相同,您无需手动指定所有原始值。编译器将为您填充,使用与情况名称相同的相同 String
原始值。您可以将自定义/自动 rawValue
的情况混合。
private enum YourEnumName: EnumListStringRaw<YourEnumName.Values>, RawRepresentable{
struct Values:StringEnumValues {
typealias Element = YourEnumName
static var allRaws:Set<String> = []
}
case caseNo1 // is equivalent to case caseNo1 = "caseNo1"
case caseNo2 = "case2"
}
YourEnumName.Values.all // Set([.caseNo1, .caseNo2])
YourEnumName.Values.allRaws // Set(["caseNo1", "case2"])
您可以获取所有原始值(根据您的 enum
定义,它们可能是 Set
或 Set
),但请注意,在此之前,您必须调用 YourEnumName.Values.initialize()
或 YourEnumName.Values.all
,以便将有效的值填充到 YourEnumName.Values.allRaws
。
Swift 不允许创建具有相同字面量的多个 enum
情况。这也适用于 EnumList
。
private enum YourEnumName: EnumListStringRaw<YourEnumName.Values>, RawRepresentable{
struct Values:StringEnumValues {
typealias Element = YourEnumName
static var allRaws:Set<String> = []
}
case caseNo1 = "case1"
//case caseNo2 = "case1" - compile error: RawValues have to be unique
}
如果您想使用您的 enum
与 Unbox
框架,请在 Podfile
中包含额外的子规范,即 EnumList/Unbox
。
target 'TARGET' do
pod 'EnumList/Core'
pod 'EnumList/Unbox'
end
然后通过使您的枚举符合 UnboxableEnum
,它将直接工作。
private enum EnumForUnbox: EnumListStringRaw<EnumForUnbox.Values>, RawRepresentable, UnboxableEnum{
struct Values:StringEnumValues {
typealias Element = EnumForUnbox
static var allRaws:Set<String> = []
}
case caseNo1 = "case1"
case caseNo2 = "case2"
}
let dictionary:[String:Any] = ["data":"case1"]
let a = Unboxer(dictionary:dictionary)
let unboxEnum:EnumForUnbox = try a.unbox(key: "data") // .caseNo1
库由单元测试覆盖:要运行与 EnumListPoroject.xcodeworkspace
项目集成的测试,请在终端中安装所有 CocoaPods 依赖项(运行 pod install
)并运行默认单元测试(⌘+U)。
要命令行测试所有单元测试,请在 项目
目录中调用 'fastlane test'。
使用 fastlane
构建项目:[fastlane 读取材料](https://raw.github.com/polac24/EnumList/v0.1.1/Project/fastlane/)。
我们使用 SemVer 进行版本控制。有关可用版本的信息,请参阅[此存储库上的标签](https://github.com/polac24/EnumList/tags)。
另请参阅参与此项目的贡献者列表。
此项目在 MIT 许可证下授权 - 有关详细信息,请参阅LICENSE 文件。