2017-09-14 93 views
0

我有一个看起来像这样的枚举:级联枚举返回类型

class CustomButton { 
    struct Section { 
    enum Root: Int { 
     case rootFirst, rootSecond, rootThird 
    } 

    enum Top: Int { 
     case topFirst, topSecond, topThird 
    } 
    } 

    var type: Any? 
} 

我有不同的CustomButton是从不同的Section,我希望能够发现哪一种类型的是每一个CustomButton通过执行类似customButton.type

现在我可以通过在CustomButton类创建一个type变量来做到这一点,但与Any为VAR类型,因为它应该存储不同类型的按钮。问题是每次我得到type变量,我必须检查我正在使用哪种类型的按钮,如type(of: type),然后,将Any类型转换为type(of: buttonType)正在报告的内容,以便我可以访问topFirstrootSecond在类型上。

有没有更简单的方法呢?我敢打赌,经过几个小时的研究,我没有找到任何东西,我对Swift也很陌生。

在此先感谢!

+0

'CustomButton'应该是'UIButton'的子类? “类型”可以采用哪些不同的值?它应该是其他的'UIButton'子类还是仅仅是'Section'的不同值? –

+0

是的,对不起,'CustomButton'是'UIButton'的一个子类。 'type'应该从'Root.rootFirst'和'Top.topSecond'等所有枚举中取得所有不同的值。 –

回答

2

我觉得您的结构过于复杂,也许我误解,但我认为你想做的事是这样的:

class CustomButton { 

    enum Section { // Not a `struct`, but an `enum` 
     enum Root: Int { 
      case rootFirst, rootSecond, rootThird 
     } 

     enum Top: Int { 
      case topFirst, topSecond, topThird 
     } 
     case root(Root), top(Top) 
    } 

    var type: Section? 
} 

var cb = CustomButton() 
cb.type = CustomButton.Section.root(.rootFirst) 
cb.type = CustomButton.Section.top(.topSecond) 

Section结构真的不是一个结构,就好象它没有成员 - 这只是一个范围。只要有人想到它可能包含的价值,就很清楚,嵌套枚举实际上是答案。

+1

我打算使用递归枚举来发布我的答案,因为我完全忘记了枚举可以在里面定义枚举的事实,所以您的解决方案甚至更好,upvoted。 –

+0

@DávidPásztor无论如何,你为什么不发布你的答案?这两种方法都是非平凡的,因此具有指导意义... – Grimxn

+0

够公平,张贴它。谢谢。 –

2

假设定义Section结构的唯一要点就是包含它的两个枚举,我建议将Section定义为递归枚举。

class CustomButton: UIButton { 

    indirect enum Section { 
     case number(Int) 
     case Root(Section) 
     case Top(Section) 
    } 

    var type: Section? 
} 

let rootFirstButton = CustomButton() 
let rootFirstType = CustomButton.Section.Root(.number(1)) 
rootFirstButton.type = rootFirstType 

let topSecondButton = CustomButton() 
topSecondButton.type = CustomButton.Section.Top(.number(2)) 

记住,对于这个具体问题,我可能会使用@ Grimxn的answer,因为没有真正的需要枚举是递归的,你只需要RootTop能够采取的值case number while using recursive approach,even value of value of CustomButton.Section.Root(.Top(.number(3)))。因此,除非您计划将部分嵌入部分,否则不需要递归enum

+1

Upvoted的努力,但Grimxn方法是完美的,很好,干净! –