我正在使用我的应用中使用的大多数字体大小来维护一个枚举,如此 -
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)
现在我面临着这个设计的两个问题 -
由于我在UI中使用它们来识别字体大小,我很可能在将来添加更多案例 -
enum FontSize : CGFloat
{
case HeaderSize = 20
case TitleSize = 18
case PrimaryButtonTextSize = 22
// Newly added
case SpecialButtonTextSize = 20
case SpecialTitleTextSize = 10
}
问题是swift enum不允许我添加具有相同值的多个案例。我当然可以删除SecondaryButtonTextSize
或SpecialTitleTextSize
并始终使用.HeaderSize -
specialButton.font = UIFont.fontWithSize(.HeaderSize)
specialTitle.font = UIFont.fontWithSize(.HeaderSize)
但这意味着如果我决定稍后更改HeaderSize,我会错过我的特殊按钮和特殊标题案例。还叫我疯了,但如果我可以使用那些这样的枚举,我会更高兴。
当然,这个枚举不会是我的应用程序使用的所有字体大小的详尽列表。会有一些一次性案例,我只需要传递一次大小值。
一种解决方案是使用另一种方法,如 -
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?
}
我知道这可能是一个无关紧要的事情,但是对于这个问题有一些设计解决方案会很棒。也许枚举根本不是解决方案!任何指针都会有所帮助!
答案 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
}