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

时间:2016-04-20 08:02:03

标签: ios swift enums

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

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

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

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

用法 -

headerLabel.font = UIFont.fontWithSize(.HeaderSize)

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

#1

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

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

    // Newly added 
    case SpecialButtonTextSize = 20
    case SpecialTitleTextSize = 10
}

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

specialButton.font = UIFont.fontWithSize(.HeaderSize)
specialTitle.font = UIFont.fontWithSize(.HeaderSize)

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

#2

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

一种解决方案是使用另一种方法,如 -

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

但是如果我能继续使用我的枚举并让它返回自定义值,那就太棒了。也许它看起来像

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

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

1 个答案:

答案 0 :(得分:5)

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

解决您的问题很简单:摆脱case并改为使用static var

enum FontSize {
    static var HeaderSize: CGFloat = 20.0
    static var SpecialButtonTextSize: CGFloat = 20.0
    static var SpecialTitleTextSize: CGFloat = 10.0
}