Swift Enum设计问题:1.具有相同值的多个案例,2.返回自定义枚举值

Tus*_*oul 1 enums ios swift

我正在维护一个包含我的应用程序中使用的大多数字体大小的枚举,如此 -

enum FontSize : CGFloat
{
    case HeaderSize = 20
    case TitleSize = 18
    case PrimaryButtonTextSize = 22
}
Run Code Online (Sandbox Code Playgroud)

我已经在UIFont扩展中编写了这个方便的方法,我希望在整个应用程序中使用 - 如 -

static func fontWithSize(size:FontSize) -> UIFont?
{
  return font = UIFont(name:"System" , size: size.rawValue)
}
Run Code Online (Sandbox Code Playgroud)

用法 -

headerLabel.font = UIFont.fontWithSize(.HeaderSize)
Run Code Online (Sandbox Code Playgroud)

现在我面临着这个设计的2个问题 -

#1

由于我在UI中使用它们来识别字体大小,我很可能在将来添加更多案例 -

enum FontSize : CGFloat
{
    case HeaderSize = 20
    case TitleSize = 18
    case PrimaryButtonTextSize = 22

    // Newly added 
    case SpecialButtonTextSize = 20
    case SpecialTitleTextSize = 10
}
Run Code Online (Sandbox Code Playgroud)

问题是swift enum不允许我添加具有相同值的多个案例.当然我可以删除SecondaryButtonTextSizeSpecialTitleTextSize始终使用.HeaderSize -

specialButton.font = UIFont.fontWithSize(.HeaderSize)
specialTitle.font = UIFont.fontWithSize(.HeaderSize)
Run Code Online (Sandbox Code Playgroud)

但这意味着,如果我决定稍后更改HeaderSize,我会错过我的特殊按钮和特殊标题案例.也叫我疯了,但如果我可以使用那样的枚举,我会更高兴.

#2

当然,这个枚举不会是我的应用程序使用的所有字体大小的详尽列表.会有一些一次性的情况,我只需要传递一次大小值.

一种解决方案是只有另一种方法,如 -

static func fontWithSize(size:CGFloat) -> UIFont?
{
  return font = UIFont(name:"System" , size: size)
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我能继续使用我的枚举并使其返回自定义值,那将是非常棒的.也许它看起来像

enum FontSize : CGFloat
{
    case HeaderSize = 20
    case TitleSize = 18
    case PrimaryButtonTextSize = 22
    case CustomSize(CGFloat) -> CGFloat    // lolwut?
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能是一个无关紧要的事情,但是对于这个问题有一些设计解决方案会很棒.也许枚举根本不是解决方案!任何指针都会有所帮助!

Ale*_*loz 5

你的枚举有init(rawValue: CGFloat)初始化程序.如果您对不同的情况使用相同的rawValue,它将无法决定从该值生成哪种情况.所以编译器不允许这样做也就不足为奇了.

你的问题的解决方案很简单:摆脱cases并使用static vars代替:

enum FontSize {
    static var HeaderSize: CGFloat = 20.0
    static var SpecialButtonTextSize: CGFloat = 20.0
    static var SpecialTitleTextSize: CGFloat = 10.0
}
Run Code Online (Sandbox Code Playgroud)