我创建了一个类似下面的枚举,我尝试使用fromRaw()函数。
enum Test : Int {
case a = 1
case b, c
func description() -> String{
switch self {
case .a:
return "a"
default:
return String(self.toRaw())
}
}
}
它适用于我这样使用的情况。 bvalue.description()给我结果" 2"。
if let bvalue = Test.fromRaw(2) {
bvalue.description()
}
但是当我尝试使用它而没有If语句时,如下所示。它给了我一个错误的通知,在第二行说"无效使用'()'调用非函数类型String的值。"
let bvalue = Test.fromRaw(2)
bvalue.description()
我很困惑。 If或if If语句有什么区别?为什么第二种方式不起作用?这个fromRaw()函数返回了什么类型?
答案 0 :(得分:7)
请注意, fromRaw()不再存在。新的用法是:
Test(rawValue: 2)
答案 1 :(得分:2)
.fromRaw()
方法返回枚举的可选值。因此,类型bvalue
不是Test
,而是类型Test?
。要访问其值,您需要使用if let...
展开它,或者强制使用!
运算符解包:
bvalue!.description()
请注意,如果.fromRaw()
调用失败,您将收到运行时错误。试试看吧:
let bvalue = Test.fromRaw(5) // 5 is out of bounds, bvalue == nil
bvalue!.description() // runtime error: Can't unwrap Optional.None
答案 2 :(得分:0)
不同之处在于,您发布的第二个代码段bvalue
是可选的。这意味着bvalue
变量的可能值为nil
。使用if语句将“unwraps the optional”设置为nil或原始值。您可以阅读有关此here的更多信息。
答案 3 :(得分:0)
fromRaw()
函数会返回一个可选的枚举,在您的情况Test?
中,可能包含Test
enum
或nil
在使用之前,您必须打开它,这正是您使用if-let
模式所做的事情
如果您尝试直接访问说明,则会导致编译错误。
您还可以使用!
运算符强制打开可选值,如bvalue!.description
中所示。但是,您应该只在明确“可选”包含实际值且不是nil
的情况下使用它。在值为nil
的情况下使用它会导致运行时错误。