我如何使用枚举的fromRaw()函数

时间:2014-06-05 15:18:29

标签: swift

我创建了一个类似下面的枚举,我尝试使用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()函数返回了什么类型?

4 个答案:

答案 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 enumnil

在使用之前,您必须打开它,这正是您使用if-let模式所做的事情

如果您尝试直接访问说明,则会导致编译错误。

您还可以使用!运算符强制打开可选值,如bvalue!.description中所示。但是,您应该只在明确“可选”包含实际值且不是nil的情况下使用它。在值为nil的情况下使用它会导致运行时错误。