【发布时间】:2019-01-18 14:43:12
【问题描述】:
我有一个类似...的枚举
enum MyEnum {
case a(Foo)
case b
case c(Bar)
enum Foo: String {
case one
case two
}
enum Bar: String {
case three
case four
}
}
我正在尝试为此创建一个可失败的初始化函数,以便您可以将其称为...
MyEnum(base: "a", parameter: "one")
或
MyEnum(base: "b", parameter: nil)
我已经让它像这样工作了(但它很笨重)......
init?(base: String, parameter: String?) {
switch (base, parameter) {
case ("a", let p?) where Foo(rawValue: p) != nil:
self = .a(Foo(rawValue: p)!)
case ("b", _):
self = .b
case ("c", let p?) where Bar(rawValue: p) != nil:
self = .c(Bar(rawValue: p)!)
default:
return nil
}
}
这将打开base,然后在进入案例之前检查是否可以创建下一个值。
但是,我现在必须创建两次 Foo 或 Bar 并强制打开第二个。
有没有办法让开关盒创建Foo 或Bar,并且只有在可以创建的情况下才输入案例,这样我就可以使用创建的那个,而不必创建第二个一个?
【问题讨论】:
-
你在 switch 中有两次
"a",是错字吗? -
@RobertDresler,~~这些情况有不同的
where谓词,它们不一样。~~哦等等,第二个应该是“c”。 -
不要太复杂。打开
base,对于情况“a”和“c”,请执行if let p = parameter, let foo = Foo(rawValue: p)(或guard let ...)。 -
或者跳过
switch语句,只使用if的:if base == "a", let p = parameter, let foo = Foo(rawValue: p)
标签: swift enums switch-statement