ios - Swift Enum design issues : 1. multiple cases having same value, 2.返回自定义枚举值

标签 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)

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

#1

由于我是根据字体大小在 UI 中的使用位置来识别字体大小的,所以我很可能会在未来添加更多案例 -

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

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

问题是 swift 枚举不允许我添加具有相同值的多个案例。当然,我可以只删除 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?
}

我知道这可能是一件微不足道的事情,但如果能针对此问题提供一些设计解决方案就太好了。也许枚举根本不是解决方案!任何指针都会有所帮助!

最佳答案

你的枚举有 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
}

关于ios - Swift Enum design issues : 1. multiple cases having same value, 2.返回自定义枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737457/

相关文章:

ios - 在使用 .a 文件的 xcode 项目中,找不到 swift erorr 'map' 文件

ios - 从 AppDelegate 更改另一个文件中的变量

ios - GoogleMaps SDK for ios 中的 fitBounds 不适合

ios - Xcode 7 记录 ui 按钮不出现

ios - 无法使用 Swift 语法过滤器

java - 如何在 Android 中创建需要上下文的单例?

web-services - 枚举值未在soap请求中传输

java - ObjectMapper 无法处理具有遗留枚举(类)的映射对象