Ios Swift枚举设计问题:1。具有相同值的多个案例,2。返回自定义枚举值
我正在使用我的应用程序中使用的大多数字体大小维护一个枚举,如下所示-Ios Swift枚举设计问题:1。具有相同值的多个案例,2。返回自定义枚举值,ios,swift,enums,Ios,Swift,Enums,我正在使用我的应用程序中使用的大多数字体大小维护一个枚举,如下所示- enum FontSize : CGFloat { case HeaderSize = 20 case TitleSize = 18 case PrimaryButtonTextSize = 22 } 我已经在UIFont扩展中编写了这个方便的方法,我希望在整个应用程序中使用它,比如- static func fontWithSize(size:FontSize) -> UIFont? {
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不允许我添加具有相同值的多个案例。当然,我可以删除secondarybuttonextsize
或SpecialTitleTextSize
并始终使用.HeaderSize-
specialButton.font = UIFont.fontWithSize(.HeaderSize)
specialTitle.font = UIFont.fontWithSize(.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)
初始值设定项。如果在不同的情况下使用相同的原始值,它将无法决定从该值生成哪个情况。所以编译器不允许这样做也就不足为奇了
解决问题的方法很简单:去掉case
s,改用static var
s:
enum FontSize {
static var HeaderSize: CGFloat = 20.0
static var SpecialButtonTextSize: CGFloat = 20.0
static var SpecialTitleTextSize: CGFloat = 10.0
}
您的枚举具有init(rawValue:CGFloat)
初始值设定项。如果在不同的情况下使用相同的原始值,它将无法决定从该值生成哪个情况。所以编译器不允许这样做也就不足为奇了
解决问题的方法很简单:去掉case
s,改用static var
s:
enum FontSize {
static var HeaderSize: CGFloat = 20.0
static var SpecialButtonTextSize: CGFloat = 20.0
static var SpecialTitleTextSize: CGFloat = 10.0
}
看一看。这是一个不同的问题,但解决方案也适用于你。看看。这是一个不同的问题,但解决方案也适用于你。