Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift枚举设计问题:1。具有相同值的多个案例,2。返回自定义枚举值_Ios_Swift_Enums - Fatal编程技术网

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
}
看一看。这是一个不同的问题,但解决方案也适用于你。看看。这是一个不同的问题,但解决方案也适用于你。