我有一个看起来像这样的枚举:
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
的类型。
现在我可以通过在type
类上创建CustomButton
变量,但Any
为var类型来实现,因为它应该存储不同的按钮类型。问题是每次我得到type
变量时,我都要检查我正在使用哪种类型的按钮,类似type(of: type)
,然后将Any
类型转换为什么type(of: buttonType)
正在举报,以便我可以根据类型访问topFirst
或rootSecond
。
有更简单的方法吗?我打赌有,但经过几个小时的研究后我什么都没找到,而且我对Swift也很新。
提前致谢!
答案 0 :(得分: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 :(得分: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,因为没有真正需要枚举的递归,你只需要{{1 }}和Root
能够在使用递归方法时获取案例Top
的值,甚至是number
的值。因此,除非您计划在部分中嵌入部分,否则您不需要递归CustomButton.Section.Root(.Top(.number(3)))
。