EnumList 0.2.0

EnumList 0.2.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2017年9月
SwiftSwift版本4.0
SPM支持SPM

Bartosz Polaczyk维护。



EnumList 0.2.0

  • Bartosz Polaczyk

EnumList

用于枚举所有枚举情况的库(用于SwiftInt RawValue)。

EnumList不依赖于非内存反射,因此设计上稳健,在未来的Swift版本中更加稳定。

Swift版本

此分支官方支持Swift 3.1,但代码与Swift 4.0兼容。

如果想要使用具有Codable支持的Swift 4.0,请检查swift4分支

安装

先决条件

为了使您的enum(具有String原始值)与EnumList兼容,请添加符合协议EnumListStringRaw<NAME_OF_YOUR_ENUM.Values>, RawRepresentable,并定义嵌套结构体Values

尽管您可以选择名称和放置符合StringEnumValuesIntEnumValues的结构体(例如,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变量创建枚举

如果您不能使用字面量(例如当您从其他地方接收到的只有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 定义,它们可能是 SetSet),但请注意,在此之前,您必须调用 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
}

Unbox 集成

如果您想使用您的 enumUnbox 框架,请在 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

运行测试

Xcode

库由单元测试覆盖:要运行与 EnumListPoroject.xcodeworkspace 项目集成的测试,请在终端中安装所有 CocoaPods 依赖项(运行 pod install)并运行默认单元测试(⌘+U)。

Fastlane

要命令行测试所有单元测试,请在 项目 目录中调用 'fastlane test'。

部署

使用 fastlane 构建项目:[fastlane 读取材料](https://raw.github.com/polac24/EnumList/v0.1.1/Project/fastlane/)。

版本控制

我们使用 SemVer 进行版本控制。有关可用版本的信息,请参阅[此存储库上的标签](https://github.com/polac24/EnumList/tags)。

作者

  • 巴托什·波拉茨基 - polac24

另请参阅参与此项目的贡献者列表

许可证

此项目在 MIT 许可证下授权 - 有关详细信息,请参阅LICENSE 文件。