为什么需要添加'!'在代码后缀中

时间:2016-02-25 03:49:05

标签: swift

enum Season: Int {
    case Spring = 0
    case Summer = 1
    case Autumn = 2
    case Winter = 3
}

var SeasonTime1 = Season.Spring

//why ? this code suffix need add !
SeasonTime1 = Season.init(rawValue: 2)!
  1. 列表项目
    //为什么?不需要添加!
    var SeasonTime2 = Season.init(rawValue:2)

2 个答案:

答案 0 :(得分:0)

因为编译器无法推断原始值类型存在,所以您需要'!'太强迫打开它。如果你将它包装在一个保护声明中,你可以确保它的类型是"你"知道它是。那你就不需要'!'

答案 1 :(得分:0)

这是因为Enum使用了一个可用的初始化程序(参见文档here)。正如其标题所暗示的那样,可用的启动器可能会失败并返回nil。可以包含nil的对象是Swift中的Optionals。因此你可以:

let seasonTime1 = Season.init(rawValue: 2)

在这种情况下,seasonTime1的类型为Optional<Season>。如果要使用该值,则必须使用if letguard!解包可选项。在这种情况下:

let seasonTime1 = Season.init(rawValue: 2)!

您正在立即展开它,因此seasonTime1的类型将为Season。请注意以下代码:

let seasonTime1 = Season.init(rawValue: 2222)!

这将运行,但如果您访问seasonTime1,它将失败。这是因为没有枚举的原始值为2222,因此seasonTime1将包含nil。由于它是隐式展开的,因此它包含nil的事实是非法的,如果发生展开会导致崩溃。