【问题标题】:Multiple Enums with same raw value具有相同原始值的多个枚举
【发布时间】:2019-10-17 12:13:59
【问题描述】:

以下 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,我都会收到这些错误 请建议我该如何解决这个问题

【问题讨论】:

    标签: ios enums swift4


    【解决方案1】:

    当您省略基于数字的枚举案例的显式值时(您已为 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.
    }
    

    【讨论】:

      【解决方案2】:

      在 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)!
          }
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2020-12-14
        • 2018-10-21
        • 1970-01-01
        • 2018-02-16
        相关资源
        最近更新 更多