具有相同原始值的多个枚举
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 的错误
请建议我如何解决这个问题
当您根据数字省略枚举案例的显式值时(您已为 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.
}
在 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)!
}
}
正在学习 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 的错误 请建议我如何解决这个问题
当您根据数字省略枚举案例的显式值时(您已为 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.
}
在 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)!
}
}