具有相同原始值的多个枚举

Multiple Enums with same raw value

正在学习 this 教程

我已经定义了在我的应用程序中使用自定义字体的结构, 但我收到一个奇怪的错误 枚举大小写的原始值不是唯一的 基本上我试图让多个枚举案例具有相同的 rawValue

我的代码如下

struct FontManager {

    enum Font: String {
        case customBlack = "CustomFont-Black"
        case customBold = "CustomFont-Bold"
        case customMedium = "CustomFont-Medium"
        case customRegular = "CustomFont-Regular"

        enum Size: CGFloat {
            case navTitle = 20
            case drawerListItemBadgeActiveFont = 10
            case drawerHeaderTitle, formFiled = 16
            case drawerHeaderSubTitle, drawerListItemActive, drawerListItemInActive = 14
            case drawerHeaderEndText, formLabel = 12
            case sampleCase = 18    
        }

        func font(size:Size) -> UIFont {
            let fontSize = size.rawValue
            let fontName = self.rawValue
            return UIFont(name: fontName, size: fontSize)!
        }
    }
}

我收到任何随机数 15、17、18 的错误 请建议我如何解决这个问题

当您根据数字省略枚举案例的显式值时(您已为 drawerHeaderTitledrawerHeaderSubTitledrawerListItemActivedrawerHeaderEndText 完成)编译器将自动将前一个案例的值增加一个并将其分配给新案例。所以你真正拥有的是:

case navTitle = 20
case drawerListItemBadgeActiveFont = 10
case drawerHeaderTitle /* = 11 */
case formFilled = 16
case drawerHeaderSubTitle /*= 17 */
case drawerListItemActive /*= 18*/
case drawerListItemInActive = 14
case drawerHeaderEndText /*= 15*/
case formLabel = 12
case sampleCase = 18 /* Duplicates drawerListItemBadgeActiveFont */

所以,您似乎希望枚举的值兼作字体大小。由于唯一性约束,你不能真正做到这一点,但你可以这样做:

enum Font {
case navTitle
case drawerListItemBadgeActiveFont
case drawerHeaderTitle
case formFilled
case drawerHeaderSubTitle
case drawerListItemActive
case drawerListItemInActive
case drawerHeaderEndText
case formLabel
case sampleCase

  var size: CGFloat {
      switch self {
           case .navTitle: return 20
           case .drawerListItemBadgeActiveFont: return 11
           case .drawerHeaderTitle, formFilled: return 16
           // ...etc...
      }
  }
}

...然后使用这样的代码提取大小:

func someFunc(font: Font) {
     let size = font.size // 20 for navTitle, etc.
}

在 Swift 中,具有 Raw 值的枚举应该有一个唯一值(假设您将启动 Size(rawValue:26),但您有两种情况可以使用此值 drawerHeaderTitleformFiled - 不是吗?)。您可以使用多个选项 - 其中一个选项只是添加一个计算 属性 而不是使用原始值:

enum Size {
    case navTitle, drawerHeaderTitle, formFiled ...

    ....
    var value: CGFloat {
        switch self:
            case .navTitle:
                return 20
            case .drawerHeaderTitle:
                fallthrough
            case .formFiled:
                return 26
           ...
    }
}

enum Font {
    func font(size:Size) -> UIFont {
        let fontSize = size.value //change rawValue to value
        let fontName = self.rawValue
        return UIFont(name: fontName, size: fontSize)!
    }
}