Несколько перечислений с одинаковым необработанным значением - PullRequest
0 голосов
/ 17 октября 2019

После этого учебника

Я определил структуру для использования пользовательских шрифтов в моем приложении, но получаю странную ошибку Необработанное значение для перечисления не уникально В основном я пытаюсь получить несколько перечислений case с одним и тем же 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)!
        }
    }
}

This is image of error

Iя получаю эти ошибки для любого случайного числа 15, 17, 18 Пожалуйста, предложите, как я могу решить эту проблему

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Когда вы опускаете явное значение для регистра enum на основе числа (которое вы сделали для drawerHeaderTitle, drawerHeaderSubTitle, drawerListItemActive и drawerHeaderEndText), компилятор автоматически увеличивает предыдущий регистрзначение на единицу и присвоить его новому случаю. Итак, что у вас есть на самом деле:

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.
}
0 голосов
/ 17 октября 2019

В Swift перечисления со значением Raw должны иметь уникальное значение (давайте представим, что вы инициируете Size(rawValue:26), но у вас есть два случая для этого значения drawerHeaderTitle и formFiled - не так ли?). Вместо этого вы можете использовать несколько опций - один из них просто добавить вычислительное свойство вместо использования необработанного значения:

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)!
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...