我正在维护一个包含我的应用程序中使用的大多数字体大小的枚举,如此 -
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个问题 -
由于我在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不允许我添加具有相同值的多个案例.当然我可以删除SecondaryButtonTextSize或SpecialTitleTextSize始终使用.HeaderSize -
specialButton.font = UIFont.fontWithSize(.HeaderSize)
specialTitle.font = UIFont.fontWithSize(.HeaderSize)
Run Code Online (Sandbox Code Playgroud)
但这意味着,如果我决定稍后更改HeaderSize,我会错过我的特殊按钮和特殊标题案例.也叫我疯了,但如果我可以使用那样的枚举,我会更高兴.
当然,这个枚举不会是我的应用程序使用的所有字体大小的详尽列表.会有一些一次性的情况,我只需要传递一次大小值.
一种解决方案是只有另一种方法,如 -
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)
我知道这可能是一个无关紧要的事情,但是对于这个问题有一些设计解决方案会很棒.也许枚举根本不是解决方案!任何指针都会有所帮助!
你的枚举有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)